Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1454 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

donner des paramètres à CG ( en openGL )

n°1478098
Amonchakai
Posté le 19-11-2006 à 15:05:41  profilanswer
 

Reprise du message précédent :
oki, le truc c'est que pour le moment j'avais pas fait de smooth skining car mon éditeur 3D ne le suporte pas :( Donc je fais du rigid skining. Bon je pense de plus en plus a faire un exporteur pour récupérer des modèles fait sous 3DS comme ça je pourrais améliorer ce genre de trucs.


Message édité par Amonchakai le 19-11-2006 à 15:06:29
mood
Publicité
Posté le 19-11-2006 à 15:05:41  profilanswer
 

n°1479518
Amonchakai
Posté le 21-11-2006 à 18:54:05  profilanswer
 

Salut !
 
   Bon, je suis encore là : j'ais toujours des problème pour passer mes paramètres à CG. Je cherche maintenant à donner les différentes matrices et l'indice de matrice associé a chaque vertex. Et là je n'y arrive pas encore...  
j'ais tout d'abord retouché a ma structure CVertex qui deviens maintenant :

Code :
  1. struct CVertex
  2. {
  3.    float x, y, z,
  4.           nx, ny, nz,
  5.           u, v;
  6.    short boneIndex;
  7. };


Donc pour le moment je reste toujours sur le rigid Skinning (un seul bone par vertice). On verra pour le smooth skinning quand j'arriverais a faire le rigid skinning.
ma méthode d'affichage deviens ça :

Code :
  1. void OGLRender::CgPaintAnimatedMesh(MeshToDisplay *ptr, std::vector<float> &matrix)
  2. {
  3. if(!ptr->inBuffer)
  4. {
  5.  MessageBox(hwnd, "Attention la mesh n'a pas été stockée dans le VB...","Erreur.",MB_OK);
  6.  return;
  7. }
  8. cgGLBindProgram(cgProgram);
  9. cgGLEnableProfile(CG_PROFILE_ARBVP1);
  10. cgGLSetStateMatrixParameter(cgParameter[0], CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  11. cgGLSetParameterArray4f(cgParameter[2], 4, matrix.size()/4, &matrix[0]);  //give the matrix to cg ie 4*float4
  12. glBindBufferARB(GL_ARRAY_BUFFER, ptr->buffer);         //we select the CVertex buffer
  13. glVertexPointer(3, GL_FLOAT, sizeof(CVertex), BUFFER_OFFSET(0));    //8*sizeof(float) is the size beteen two texture data
  14. glNormalPointer(GL_FLOAT, sizeof(CVertex), BUFFER_OFFSET(3*sizeof(float)));  //BUFFER_OFFSET(2*sizeof(float)) give information about the position of the begining of the data
  15. glTexCoordPointer(2, GL_FLOAT, sizeof(CVertex), BUFFER_OFFSET(6*sizeof(float)));
  16. cgGLSetParameterPointer(cgParameter[1], 1, GL_SHORT, sizeof(CVertex), BUFFER_OFFSET(8*sizeof(float))); //give to the cgProgram the index of the bone attached to the vertex
  17. glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, ptr->indexBuffer);      //we bind the indexBuffer
  18. cgGLEnableClientState(cgParameter[1]);
  19. glEnableClientState(GL_VERTEX_ARRAY);
  20. glEnableClientState(GL_NORMAL_ARRAY);
  21. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  22. glDrawElements(GL_TRIANGLES, ptr->index.size(), GL_UNSIGNED_SHORT, 0);  //display
  23. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  24. glDisableClientState(GL_NORMAL_ARRAY);
  25. glDisableClientState(GL_VERTEX_ARRAY);
  26. cgGLDisableClientState(cgParameter[1]);
  27. }


et mon vertex program :

Code :
  1. struct OUT
  2. {
  3.    float4 Position : POSITION;
  4.    float4 Color : COLOR0;
  5. };
  6. OUT main(      float4 pos : POSITION,
  7.                float4 color : COLOR,
  8.        float index : TEXCOORD0,
  9.        uniform float4x4 matrixModelView,
  10.        uniform float4 boneMatrix[8])
  11. {
  12.    OUT o;
  13.    float4x4 model = float4x4(boneMatrix[index], boneMatrix[index+1], boneMatrix[index+2], boneMatrix[index+3]);
  14.    float4 netPosition = mul(model, pos);
  15.      
  16.  
  17.    o.Position =  mul(matrixModelView, netPosition);
  18.    o.Color = color;
  19.    return o;
  20. }


et là quand j'exécute mon programme j'ais toujours le droit a mon écran noir...
J'ais pourtant touvé pas mal de doc et je suis bien ce qu'ils disent, mais je sais pas où se trouve mon erreur.  :( et puis l'ennuis c'est que le débuggage avec cg c'est pas facile : pas d'entrée sortie pour vérifier les paramètre. donc ça aide pas...
 
Sinon, j'aurrais une question de principe : finalement je me suis dit que c'était pas nécéssaire de passer par un buffer pour stocker mes matrices puisque je sais que a chaque fois que je passe dans la boucle d'affichage je vais vider le buffer et le reremplir. Donc dans dans ce cas là l'utilisation d'un buffer ne sert a rien non ?
 
Merci :)


Message édité par Amonchakai le 21-11-2006 à 19:08:40
n°1479524
IrmatDen
Posté le 21-11-2006 à 18:58:42  profilanswer
 

Y manque pas une partie du message là? :D

n°1479527
Amonchakai
Posté le 21-11-2006 à 19:09:06  profilanswer
 

oui, j'ai eu un petit soucis :D

n°1479532
bjone
Insert booze to continue
Posté le 21-11-2006 à 19:19:33  profilanswer
 

index*4 non ?

n°1479535
Amonchakai
Posté le 21-11-2006 à 19:22:14  profilanswer
 

voilà, j'avais trouvé ça sur Nvidia Developper : http://developer.nvidia.com/object [...] ition.html
qui permettait d'avoir des petits exemples sur le passage de paramètres et autres... ça m'aide plutôt bien même si j'arrive pas a le faire fonctionner :D car il faut admettre que même si le livre The CG Tutorial est super bien ils ne parlent que très peu de la façon de lancer les programmes : juste une annexe a la fin du livre... donc vive les recherches Google pour réussir a avoir plus d'info sur le sujet :)

n°1479537
Amonchakai
Posté le 21-11-2006 à 19:25:24  profilanswer
 

bjone a écrit :

index*4 non ?


 
oui, c'est vrai pas faux, mais ça ne marche toujours pas...
edit : mais MERCI de ton aide :)


Message édité par Amonchakai le 21-11-2006 à 19:31:20
n°1479564
Amonchakai
Posté le 21-11-2006 à 20:09:18  profilanswer
 

Salut !
  Bon j'ai déjà commencé a cerner le problème : il viens des matrices. Je viens de trouver une méthode pour tester le contenu de mes variable (un vieux if() qui compare le contenu et ce qu'il devrais contenir qui provoque un changement de couleur :D) Et donc conclusion : les index sont bon, mais par contre les matrices sont toutes nulle... ce qui explique l'écran noir :). Reste plus qu'a regarder ça de plus près...

n°1479575
IrmatDen
Posté le 21-11-2006 à 20:28:05  profilanswer
 

Code :
  1. cgGLSetParameterArray4f(cgParameter[2], 4, matrix.size()/4, &matrix[0]);


Je ne sais pas comment tu organises tes bones, mais ton shader s'attend à 4x8 éléments.
Là, tu décales les éléments de 4 positions. le nombre d'éléments devraient être égals à 32 hors tu divises par 4 le résultat de size().
 
A prendre avec des pincettes ne connaissant pas mieux ta structure de matrices, mais c'est peut-être une piste.
 

Spoiler :

ou je suis peut-être complétement à côté de la plaque :/

n°1479582
bjone
Insert booze to continue
Posté le 21-11-2006 à 20:38:36  profilanswer
 

bin disons que dans son skinning y'a pas de blending :D
et la place pour deux matrices :D


Message édité par bjone le 21-11-2006 à 20:38:48
mood
Publicité
Posté le 21-11-2006 à 20:38:36  profilanswer
 

n°1479585
IrmatDen
Posté le 21-11-2006 à 20:43:35  profilanswer
 

Et? Le fait qu'il n'y ait pas de skinning fait juste qu'il ne passe/récupère pas un tableau d'indice + poids non? Je vois pas l'influence sur le passage de la liste des matrices des bones  :??:
(noob inside aussi hein ;) )

 

Edit: j'ai été un peu long à poster :/
Où lui manque-t-il de la place pour une 2ème matrice? Il en attend 8 dans son shader. Je dois rater quelque chose là :(

 

Reedit: on est bien d'accord qu'il n'envoie pas des vraies matrices mais des 8 vecteurs de 4 éléments? Sinon, je vois le souci effectivement :)

Message cité 1 fois
Message édité par IrmatDen le 21-11-2006 à 20:50:26
n°1479598
Amonchakai
Posté le 21-11-2006 à 21:17:24  profilanswer
 

Salut !
 
   Tout d'abord merci de votre aide :)
 
   Bon, effectivement j'ai oublié de vous dire a quoi correspond mon vector matrix. En fait il sagit d'un tableau qui contient tous les vecteur bout a bout. Ainsi pour les matrices :
2 6 8 9
7 8 5 2
4 5 7 6
2 3 4 7
 
2 6 8 7
6 9 8 7
2 3 4 9
2 3 4 5
 
j'ais dans mon vector : 2 7 4 2 6 8 5 3 9 2 6 7 2 6 2 2 6 9 3 3 8 8 4 4 7 7 9 5
donc ça me paraissait logique d'envoyer (vector.size() / 4) float4.
 
Au sujet de la place pour les deux matrices, c'est vrai je n'ai pas laissé plus de place car je n'ai que qu' un bone sur le modèle sur lequel je travaille. Le problème du rigid skinning ben c'est surtout pour n'avoir qu'un problème a la fois ;)

n°1479658
IrmatDen
Posté le 21-11-2006 à 23:20:57  profilanswer
 

Tiens, je viens de lire le manuel là (je suis trop paumé sinon :D), et j'ai vu que cgGLSetParameterPointer ne servait pas à ça, apparemment :)
 
De ce que je lis, il faudrait que tu utilises cgGLSetParameterArray4f (page 49 du manuel fourni sur le CD du bouquin).
Tu as déjà testé?


---------------
.
n°1479678
bjone
Insert booze to continue
Posté le 22-11-2006 à 02:08:16  profilanswer
 

IrmatDen a écrit :

Et? Le fait qu'il n'y ait pas de skinning fait juste qu'il ne passe/récupère pas un tableau d'indice + poids non? Je vois pas l'influence sur le passage de la liste des matrices des bones  :??:  
(noob inside aussi hein ;) )
 
Edit: j'ai été un peu long à poster :/
Où lui manque-t-il de la place pour une 2ème matrice? Il en attend 8 dans son shader. Je dois rater quelque chose là :(
 
Reedit: on est bien d'accord qu'il n'envoie pas des vraies matrices mais des 8 vecteurs de 4 éléments? Sinon, je vois le souci effectivement :)


 
ouais enfin on est d'accord :) (enfin je crois :D)
 
l'interêt de faire du rigide comme ça par contre, c'est d'animer des éléments d'un modèle avec la même commande de traçage.

n°1479679
IrmatDen
Posté le 22-11-2006 à 02:15:55  profilanswer
 

Oui... et non :D
Il envoyait rééllement des matrices, j'avais compris de travers en fait [:barthaliastoxik]


---------------
.
n°1479702
Amonchakai
Posté le 22-11-2006 à 08:30:35  profilanswer
 

IrmatDen a écrit :

Tiens, je viens de lire le manuel là (je suis trop paumé sinon :D), et j'ai vu que cgGLSetParameterPointer ne servait pas à ça, apparemment :)
 
De ce que je lis, il faudrait que tu utilises cgGLSetParameterArray4f (page 49 du manuel fourni sur le CD du bouquin).
Tu as déjà testé?


 
   Oui, je pense que l'on est d'accord : j'utilise cgGLSetParameterPointer() pour donner les indices (qui ont l'air d'être bien reçu par mon prog CG) et cgGLSetParameterArray4f() pour envoyer le tableau de float4. Si on est bien d'accord tu peut remarquer que c'est ce que je fais ;) Je viens de créer une structure float4 qui contient 4 float pour que ma matrice soit en fait un vector de float4. car j'avais lu dans un manuel trouvé sur le site de Nvidia (cf un post plus haut pour le trouver) qu'ils faisaient comme ça. Mais ça ne change rien... Mais bon, je continue a regarder le manuel sur le CD fourni avec le livre.
 
   Merci :)

n°1479795
IrmatDen
Posté le 22-11-2006 à 10:58:20  profilanswer
 

Ok, vraiment désolé, j'ai mal lu :(
Je donne ma langue au chat :/

n°1480109
Amonchakai
Posté le 22-11-2006 à 17:40:00  profilanswer
 

  Ok, bon bha merci pour ton aide :)

n°1481530
Amonchakai
Posté le 24-11-2006 à 19:48:31  profilanswer
 

  Salut !
 
   bon, je suis toujours bloqué... mais j'aurrais une petite question : quand tu veut récupérer le CGparameter d'un tableau, tu utilise bien juste la méthode cgGetNamedParameter() pour le récupérer et rien d'autre non ? Car j'arrive a envoyer n'importe que type (matrice, float2, float3, ...) du moment que ce n'est pas un tableau... Aussi je pense que je doit être passé a côté de quelque chose de ce côté. J'ai déjà vu qu'il existait plusieurs fonctions pour déterminer les différentes caractéristique des paramètres et pour le moment tout a l'air cohérent avec ce que celà devrai être... Mais bon au cas où je serais passé a côté de quelque chose je demande toujours ;)
 
Merci

n°1481611
Amonchakai
Posté le 25-11-2006 à 11:13:14  profilanswer
 

Salut !
   
   bon, tout d'abord je suis toujours intéressé par la question que j'ai posée juste au dessus. donc si quelqu'un a déjà réussit a envoyer un tableau a CG, merci de me dire comment il a reçut les paramètres :)
   Sinon, je vous préviens que j'ai trouvé une première solution a mon problème, c'est ça :

Code :
  1. for(int i = 0 ; (i < matrix.size()) && (i < cgGetArraySize(cgParameter[1], 0)) ; i++)
  2. {
  3. CGparameter param = cgGetArrayParameter(cgParameter[1], i);
  4. cgGLSetParameter4fv(param, &matrix[i].x);
  5. }


bon, je pense que tout le monde va être d'accord avec moi quand je dis que ça pue comme méthode : c'est du même niveau que les glVertex3f()... mais faut reconnaitre que ça a le mérite de marcher... c'est pour ça que si quelqu'un peut me dire comment il reçoit les paramètres des tableaux ça pourrait m'aider.
 
   Merci :)

n°1481652
bjone
Insert booze to continue
Posté le 25-11-2006 à 13:15:08  profilanswer
 

bah, oui et non si c'est à plus basse fréquence.
de plus rien ne t'empèche de récupérer tous les params à l'initialisation du moteur, et de les réutiliser ensuite.

n°1481666
Amonchakai
Posté le 25-11-2006 à 14:19:00  profilanswer
 

  Oui, d'accord mais moi ce qui me gêne là, c'est que je vais envoyer les float4 un par un... et je pense qu'en moyenne j'en aurrais 80 float4 par modèle animé. Et je le fais a chaque fois que je passe par ma méthode Paint() c'est pour ça que ça me plaisait pas... Biensur c'est toujours moins gênant que si c'était les vertices... mais bon...  
 
   Mais alors tu dis que comme c'est moins fréquent ce n'est pas si grave ? Sinon, oui je vais récupérer les param au chargement du modèle.

n°1481721
bjone
Insert booze to continue
Posté le 25-11-2006 à 17:08:00  profilanswer
 

bin le nombre d'opération de définition de constantes est assez important par modèle.
 
idéalement si tu passes des matrices, bin il faudrait un setparameter qui puisse passer des matrices ou un tableau de matrices pour réduire le coût API, mais en D3D c'est pas si différent je dirais.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C++ OpenGL] probleme avec les callback du glutessOpengl+Qt impossible de charger une texture
Matrices & openGLconvertir du opengl en 'off-line rendering' (povray, pbrt, pixie...)
Donner comme valeur a une variable le mot d'un fichier .txt[OpenGL] ¨Probleme pour compiler
[openGL] Rotation d'un objet face a un pointOperateur "|" dans les parametres d'une fonction
[C#] linkbutton - paramètres dans l'url ?pb de parametres en C...
Plus de sujets relatifs à : donner des paramètres à CG ( en openGL )


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR