donner des paramètres à CG ( en openGL ) - C++ - Programmation
Marsh Posté le 12-11-2006 à 12:19:10
heu désolé... en relisant mon post, j'ai vu l'érreur...
j'avais oublié d'écrire : cgParameter = cgGetNamedParameter(cgProgram, "Position" );
je suis trop nul...
bon par contre j'ai toujours mon écran rouge... si vous avez une idée.
(et encore désolé pour la première question...)
Marsh Posté le 13-11-2006 à 00:05:12
Salut,
Il ne faut pas setter le paramètre position. Etant obligatoire, le fait d'utiliser la sémantique POSITION fait qu'il va automatiquement la chercher dans le registre matériel dédié. Tu n'as aucun paramètre dans le programme actuel que tu doives modifier en code.
Marsh Posté le 13-11-2006 à 08:39:26
Salut,
Tout d'abord merci de ta réponse !
Mais j'avoue ne pas avoir compris ta réponse... Je vais relire le chapitre de mon livre sur CG qui parlait de ça. Il y a un truc auquel j'ai du passer a côté. J'ai fait un fragment program qui fait la même chose, et là ça marche... mais j'avoue ne pas comprendre pourquoi le vertex program ne marche pas (par ce que dans les exemples du livre ils faisaient bien ça...). je relis le chapitre en question, et peut être que cette fois-ci je comprendrais.
Merci a toi de m'avoir répondu !
Marsh Posté le 13-11-2006 à 17:05:27
Salut !
Bon, j'ai potassé mon livre ça ma permis de remettre mes idées au clair sur les différentes étapes qui ont lieu dans la graphic pipeline...
Donc si je comprend bien ce que tu me dit, c'est que comme j'écrit un vertex program, le fait de donner les positions des vertices est obligatoire (puisque vertex program...) donc je n'ais pas à le faire manuellement via des cgGetNamedParameter(), puisque de lui même il va prendre les positions dont il a besoin pour mon programme CG. C'est bien ça ?
Donc en partant de ce principe, j'ai retiré tout ce qui avait rapport aux paramètres. Et au final, j'ai toujours le même problème... (écran tout rouge) J'ai particulièrement les boules car je sais que si je fait un fragment program qui fait la même chose, ça marche (seul me modèle est rouge). Mais le truc, c'est que pour ce que je veut faire (l'animation) je vais impérativement avoir besoin que ce programme se déroule au niveau des vertices et non des fragments.
Si tu as une idée... (ou du moins me confirmer si j'ai bien compris ce que tu as dit...)
Merci de te pencher sur mon problème !
Marsh Posté le 13-11-2006 à 17:16:35
Bon, j'aurais espéré que le résultat était un effet de bord
La seule autre solution que j'imagine là, c'est de transformer tes sommets par la matrice de modelview. Ce n'est pas démontré dans les tout premiers tutos, mais c'est nécessaire par la suite pour garder la relation entre le modèle et l'orientation/position/taille du monde.
J'imagine que c'est dans ton bouquin, mais au cas où, voici un autre lien où c'est expliqué.
Et si ce n'est pas ça, je vois plus trop après
(Tu ne nettoierais pas ton écran en rouge à tout hasard?? )
Edit: et c'est effectivement ça, ou du moins ce que j'en ai compris/observé aussi, au sujet des vertices que l'on ne passe pas au shader.
Marsh Posté le 13-11-2006 à 17:37:19
ok, je viens de vérifier : je nettoie pas l'écran en rouge (on sais jamais, valait mieux vérifier...)
Bon, je vais regarder du côté de la matrice modelView. (et bien vu NeHe, j'avais oublié de regarder par là...)
Merci
Marsh Posté le 14-11-2006 à 21:48:19
Salut !
Bon et bien j'avance a petit pas... déjà j'ai plus mon écran rouge depuis que j'ai rajouté la multiplication par la modelView. Maintenant j'ai juste droit à l'écran noir... (j'ai bien vérifié que mon code compile via cgc...)
donc voilà a quoi resssemble mon prog cg actuel :
Code :
|
ce qui est entre guillemet "marrant" c'est que tu as bien raison sur le fait que si je renvois la postion tout de suite, j'ai le droit a l'écran rouge...
Donc sinon je me suis dit qu'il y avait peut-être une histoire avec la position du modèle : en effet si je ne fais pas de translation mon modèle n'est pas dans le champ de vue. J'ai donc essayé de voir si ce n'était pas une histoire de ce genre en faisant ça :
Code :
|
histoire de rajouter la position du centre du repère après translation. Mais non, ça marche pas...
Si quelqu'un a une idée...
Merci
Marsh Posté le 15-11-2006 à 00:31:09
Côté VS, je pense pas qu'il y ait quoi que ce soit de faux maintenant (dans la première version, pour la 2nde, je n'ai jamais testé).
J'imagine que ça reste tout de même une histoire de translation/échelle?
On n'obtient de toute évidence pas un écran noir quand le modèle est visible
Le code de dessin a-t-il changé? Dans celui du premier post, tu ne déplaces pas ton entité (ni n'y applique aucune transformation en fait).
Où se trouve la caméra? Peux-tu peut-être poster le code d'update de la scène/affichage stp? (avec quelques mots pour situer le rôle que tu assignes à chacun si nécessaire )
Edit: Je reviens sur le VS en fait
Ne faudrait-il pas utiliser COLOR0 au lieu de COLOR pour la sémantique de OUT.color ?
Marsh Posté le 15-11-2006 à 09:02:44
Ok, merci de t'occuper de mon cas . j'ai regardé le coup de mettre la sémantique COLOR0 et malheureusement ça ne change rien...
Pour ce qui est de mon code pour l'affichage, voilà :
j'ai tout d'abord une classe OGLRender qui hérite de la classe Render. La classe Render est une classe abstraite qui contient de façon implémenté la création d'une fenêtre win32 + traitement des messages, et des méthodes virtuelle pure pour tout ce qui conserne la 3D (j'ai l'intention de faire une implémentation directX plus tard...)
voilà le header de OGLRender :
Code :
|
pour les implémentation on a ça :
Code :
|
Maintenant pour ce que est de l'appel des méthodes de OGLRender, j'ai une classe ModelInstance qui ressemble a ça :
Code :
|
bon comme tu peut le remarquer modelInstance utilise deux classes TextureCollection et ModelCollection qui sont en fait deux classe qui héritent d'une std::map pour associer une std::string a un boost::shared_ptr sur la texture/Model. C'est là que tous mes modèles sont conservés en mémoire.
ModelLoader et TextureLoader sont comme leurs nom indique des loader qui me renvoient le smart_ptr après lecture sur un fichier (et donc le met ensuite dans les collections correspondante.)
je te donne aucunne implémentation la dessus, si tu estime avoir besoin de qqch n'hésite pas a demander
(ps : cette classe passera bientôt abstraite...)
donc ensuite j'ai ensuite deux autres classe : StaticInstance et DynamicInstance qui toutes deux héritent de ModelInstance. Et mes shaders que j'essaient de metre sont au niveau de DynamicInstance. Voilà a quoi celà ressemble :
Code :
|
et les implémentation des affichages :
Code :
|
Donc en fait tu peut remarquer que l'affichage a ce niveau consite a rappeler les methodes de OGLRender en donnant toutes les mesh du modèle. Donc ça me parrait plutôt explicite... si tu as une question (ou plus )...
La méthode computeMatrix() est une méthode récursive qui me permet de calculer toutes les matrices pour l'affichage d'un object annimé. comme tu peut voir sur la méthode Play(), j'avais juste a toucher aux postion des vertices en utilisant les matrices calculées pour réaliser mon animation.
Bon je suis en train de me dire que je t'ai pas encore donné la classe Model. Donc elle ressemble a ça :
Code :
|
Bon le destructeur me sert juste a renvoyer un messsage d'erreur si un modèle est détruit alors qu'il est encore présent dans un buffer...
Bon, maintenant reste plus qu'a apeller tout ce beau monde :
donc j'ai une classe Sonic (pourquoi pas... ) qui hérite de la classe OGLRender qui donne ça :
Code :
|
dans laquelle je surcharge la méthode Paint() qui définit ce qui doit être affiché. (elle est apellée dans la classe Render dans la boucle d'affichage).
donc voila les implémentations :
Code :
|
bon je sais j'ai mis un peu a la crade le calcul des fps... je rendrais ça plus propre après...
voili voilou, reste plus qu'a tout lancer a partir de main comme ça...
Code :
|
et ça marchait jusqu'au shaders...
( je pense que là j'ai fait le post le plus long du monde )
Marsh Posté le 15-11-2006 à 16:21:49
bin ça progresse à ce que je vois
bon j'ai un peu de mal à voir ton problème (là pour le coup ).
par contre quelques petites remarques de principe:
- "const std::string fileName" à remplaçer par "const std::string &fileName"
- les .at() à la limite fait un alias style:
const classe_material &Mat = model->material.at(prevTextIndex);
comme ça le test des bornes n'est fait qu'une seule fois.
plus économique et plus lisible lors de l'appel de setMaterials().
ndlr, peut être placer plus de try/catchs proche des zones d'exception, mais bon personnellement je préfèrerai vérifier les "données" au moment de leur "assimilation" (lecture disque etc...), que d'avoir des tonnes de vérifications à l'éxécution temps réel.
genre quand tu charges le modèle depuis le disque, tu vérifies la cohérences des données et des dépendances, comme ça en principe pas besoin de tout vérifier à chaque fois.
- évite le franglais: Sonic SonicRender(ecran, hInst);
- classes & instances un peu plus explicites:
DynamicInstance *model2;
ModelInstance *model;
- le type _int64 doit être dégageable par le type "long long"
Marsh Posté le 15-11-2006 à 18:00:14
Désolé, je vois pas là
Si tu es d'accord, j'aimerais bien jeter un oeil aux sources, si tu peux mettre ça en ligne (sources+données, bref, près à compiler et tourner ).
Marsh Posté le 15-11-2006 à 18:37:59
>bjone
Salut !
Oui, c'est vrai que ça avance bien : je me fais bien plaisir (sauf quand ça marche pas...). Donc je prend bien noté les améliorations à faire. Le coup des .at() ça va être marrant : plein de lignes à changer...
Pour ce qui est du franglais, j'avais pourtant fait des efforts ... mais il y en a quelques un qui m'ont échappés...
Une petie question : c'est quoi le problème avec __int64 ? je veu bien mettre des long long à la place, mais pourquoi ? problème de portabilité ? (visual avait l'air de le reconnaitre comme un type standard donc je ne pensais pas qu'il pouvait poser problème...)
Toujours est-il Merci de m'avoir signalé les trucs que tu trouve pas beau !
>IrmatDen
Salut !
Pas de problème, je veut bien poster mon projet prêt à compiler. Comme j'ai déjà posté presque toute les lignes de code, je vois pas ce que je pourrais vouloir cacher . Il me faut juste le temp de trouver le moyen de d'hoster l'archive .rar en question. (pour le moment je connais juste des host d'images gratuits). Des que j'ai trouvé je te l'envois.
Marsh Posté le 15-11-2006 à 18:59:57
Amonchakai a écrit : Il me faut juste le temp de trouver le moyen de d'hoster l'archive .rar en question. (pour le moment je connais juste des host d'images gratuits). Des que j'ai trouvé je te l'envois. |
Megaupload fonctionne pas mal; même s'il faut patienter, y'a des pubs etc... C'est gratuit
Marsh Posté le 15-11-2006 à 19:54:28
Amonchakai a écrit : >bjone |
__int64 me fait penser à un hack propriétaire.
"long long" viens du C99 si je ne m'abuse (bon okay c'est pas du C++ le C99), mais bon en plus je trouves le type "long long" plus homogène vis à vis des autres types de base.
Marsh Posté le 15-11-2006 à 20:15:10
ok, merci !
mais voilà, je comprend pas comment il marche (oui, je sais là je suis un gros boulet....) donc j'ai uploadé le truc et j'arrive a ça :
http://www.megaupload.com/fr/?d=QB51GL8L
et là je vois pas où je récupère l'adresse de ce que j'ai envoyé... Si tu trouve, ben tant mieux
je vais continuer a chercher voir aller chercher un autre ébergeur...
Marsh Posté le 15-11-2006 à 20:24:27
C'est exactement ce lien, pas besoin de chercher plus loin
J'y jetterais un oeil en rentrant ce soir.
Marsh Posté le 15-11-2006 à 20:29:06
ok, en fait ça y est j'ai compris comment on télécharge ensuite...
Merci a toi pour ton aide
Marsh Posté le 15-11-2006 à 20:31:39
bjone a écrit : __int64 me fait penser à un hack propriétaire. |
ok, merci pour cette précision donc va pour long long
Marsh Posté le 15-11-2006 à 20:39:57
oui, mais je pense que tu doit pas être bien loin car quand je regarde winNT.h on trouve ça : typedef __int64 LONGLONG; donc je pense que ça doit pas loin du long long. Et c'est vrai que dans tous les livres que j'ai lu j'ai pas vu de __int64. Donc je vais faire comme tu dit et prendre un long long.
Marsh Posté le 15-11-2006 à 22:41:29
Tout va bien au final
Ca marche nickel sur mon poste (j'ai rendu vert au lieu de rouge pour vérifier)
Essaie voir un rebuild all, tu dois avoir quelque chose de foiré qui traîne, parce que c'est tout bon
Par contre, une petite remarque au passage: dans les profils debug, évite de désactiver les infos de debug et d'activer les optims, ça, c'est le boulot du profil release.
Marsh Posté le 15-11-2006 à 23:33:48
tu dit que tu n'as pas touché au code et ça marche...
j'ai fait un "rebuild solution" et ça change rien... je vois pas le model : l'écran est désespérément noir....
tu croit que c'est ma carte graphique une Radeon X700m 128Mo sur PCI Express elle doit être capable de gérer ça non ? (surtout que le fragment program marche...)
mais u dit que tu as rien touché ?
Marsh Posté le 16-11-2006 à 00:16:30
Rien du tout
Tu peux toujours essayer en crééant une nouvelle solution. Juste à tout hasard...
Par contre, tu n'as pas parlé de fragment shader jusqu'ici, ni dans l'archive. Réessaie en le virant éventuellement.
Et pour ta CG, rassures-toi, c'est pas ça qui va la mettre à genoux
Marsh Posté le 16-11-2006 à 14:53:11
ça y est, je commence a arriver au bout de mon problème : j'ai essayé de lancer mon exécutable sur les portables de mes copains et ho miracle, ça marche chez tout le monde ! Sauf chez moi là c'est un comble...
Donc il me reste plus qu'a mettre a jour toutes mes dll relative a openGL, mettre a jour les drivers de ma carte graphique et j'espère que ça marchera
Par contre il y a un truc qui me fait peur c'est que j'ai un copain qui a plusieurs OS sur son portable et sous Vista, pas moyen de faire fonctionner les extensions ARB .... donc pas de vertex buffers en openGL.... Heu, il y a un soucis dut au fait que vista est en version béta pour le moment ou tout ce que je fais ça sera plus utilisable quand les gens seront sous Vista ?
Marsh Posté le 16-11-2006 à 15:04:24
ça sera utilisable pour la finale.
de base Vista émule un OpenGl basique via D3D.
ensuite ATI & nVidia fournissent des drivers avec un support amélioré.
les betas ayant le cul entre plein de chaises, ça doit être de l'OpenGl 1.1.
Marsh Posté le 16-11-2006 à 15:05:53
Amonchakai a écrit : ça y est, je commence a arriver au bout de mon problème : j'ai essayé de lancer mon exécutable sur les portables de mes copains et ho miracle, ça marche chez tout le monde ! Sauf chez moi là c'est un comble... |
J'ai pas testé mais sous Vista je crois que pour l'instant ni ATI, ni NVIDIA n'ont porté leur ICD, par conséquent les applications OpenGL utilisent le wrapper fournit par Microsoft qui doit s'arrêter à OpenGL 1.4 si je ne m'abuse. A terme les ICD seront disponibles sous Vista ne t'inquiètes pas
edit et merde grillé mais c'est du 1.4 maintenant le wrapper MS a fournit un effort surhumain
Marsh Posté le 16-11-2006 à 15:06:37
ok, merci je suis tout de suite plus rassuré. j'arrais été dégouté que ça marche plus sous Vista
Marsh Posté le 16-11-2006 à 15:57:53
oki, en fait j'ai dis 1.1 mais j'en étais pas sûr
Marsh Posté le 16-11-2006 à 16:02:41
une petie question vous avez quoi comme version pour vos DLL ?
Moi j'ai :
opengl32.dll 5.1.2600.2180
opengl.dll 4.5.7.36
glu32.dll 4.0.336.1
et glut32.dll et glaux.dll qui n'ont pas ne n° de version
j'ai été voir les pilotes de ma carte graphique et ça ne change rien.....
Merci a ceux qui prendrons le temp de regarder
Marsh Posté le 16-11-2006 à 17:50:14
As-tu compris ce qui n'allait pas? C'est quoi qui foirait?
Marsh Posté le 16-11-2006 à 18:26:04
ben, disons que ça s'est mis a marcher après avoir changé les pilotes de ma carte graphique... tout a l'heure quand je les avais changé j'avais pas réussit a trouver les dernier pilote . Le site d'ATI me donnais un petit prog qui ne voulais pas reconnaitre ma carte graphique donc je pouvais pas installer leurs drivers via ce prog. j'ai donc du chercher les driver a un autre endroit, et ceux que j'avais trouvé n'était pas les derniers...
J'ai donc ensuite finalement réussit a trouver les derniers en date, et là ça marche niquel !
en gros le problème se trouvait au niveau des divers...
enfin toujours est-il maintenant ça marche (comme quoi, quand ça marche pas c'est pas forcément ma faute )
Marsh Posté le 16-11-2006 à 18:29:27
Au fait, je le redirais jamais assez. Mais MERCI de votre aide a tous !
Marsh Posté le 19-11-2006 à 12:28:25
Salut !
De retour avec une petite question : Est ce que vous connaitreriez pas le moyen d'utiliser une sorte d'index buffer pour les paramètres de CG ?
Car mon problème c'est que pour l'animation de mes personnages je ne voulais pas toucher à mes buffer qui contiennent toutes les positions, normales, coordonnée de texture,... donc pour ça je pensais passer par CG, lui envoyer les différentes matrices et qu'ensuite dans mon programme CG, je fais la multiplication de mes différentes données par les matrices. jusque là OK, mais le problème c'est qu'il est vraiment plus que dérésonable d'envoyer autant de matrices que de vertices... sachant qu'en réalité il n'existe pas plus d'une dizaine de matrice différente. Donc c'est pour ça que je cherche à trouver un index buffer pour les paramètres. Mon livre n'en parle pas et les différentes doc sur CGGL que j'ai trouvé n'en parle pas également... Pire : quand je regarde le chapitre de mon livre consacré a l'animation je vois qu'en réalité, il modifient leurs buffer toutes les t secondes avec t le temp entre deux keyframes. Oui, car eux en fait ils donne en paramètre à CG la position A ,la position B et le temp. Et ensuite il font l'interpolation entre les deux position dans le programme CG via la fonction "lerp" (pour une interpolation linéaire ). Donc en réalité, eux ils ne donnent pas les matrices... Donc c'est pour ça que je me demande si en réalité cela est est possible. D'où j'aimerais bien savoir si vous connaissez le moyen d'utilier un index buffer pour les paramètres. Sinon il va falloir que je passe comme ils font dans le livre. A savoir que je vais vider très féquament mes buffers.
Merci
Marsh Posté le 19-11-2006 à 13:30:17
Salut,
Je suis pas sûr de bien te comprendre
Amonchakai a écrit : Oui, car eux en fait ils donne en paramètre à CG la position A ,la position B et le temp |
Là, c'est un exemple d'animation par keyframe; pas d'utilisation de tableau possible effectivement.
Amonchakai a écrit : lui envoyer les différentes matrices et qu'ensuite dans mon programme CG, je fais la multiplication de mes différentes données par les matrices. |
Et là, tu as l'air de parler de skinning (utilisation d'un squelette)...
Si tu utilises bien cette méthode, alors, oui, tu peux faire de l'animation par matrice.
Alors, tout dépend de ton choix
Et c'est quoi ton bouquin?? J'ai Cg Tutorial, et y'a le chapitre Vertex Skinning qui est collé à celui des keyframes (et j'en connais pas encore vu d'autres sur Cg )
Marsh Posté le 19-11-2006 à 14:09:26
Salut !
En ce qui conserne le livre on a bien le même celui là : http://www.amazon.fr/Cg-Tutorial-D [...] 0321194969
Donc, en fait tu as raison : je me suis un peu embrouillé.
Donc au final j'ai même la réponse a ma question (quand je regarde le bon paragraphe ) : ils envoient toutes les matrices plus un paramètre qui donne l'indice de quel matrice est utilisée. Je trouve que ça fait un peu bidoulliage mais bon... Mais ça permet de les mettre dans un même buffer, et de les envoyer via un cgGLSetParameterPointer().
Ok, Merci
Marsh Posté le 19-11-2006 à 14:49:14
la philosophie avec une animation par bone, c'est d'avoir comme élément de chaque vertex, un tableau de 4 indices indexant les matrices influencant le vertex et les 4 flottants associés pour les poids de chaque matrice.
tu prends par exemple 4 entiers 8 bits, ça te donne 256 matrices différentes max par un modèle, tes N matrices utiles (pas forcément 256) sont soit placées en registre de constante, soit stoquée dans un autre VertexBuffer si tu utilises le GeometryInstancing (pas forcément remarque).
Marsh Posté le 19-11-2006 à 15:05:41
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.
Marsh Posté le 12-11-2006 à 12:10:23
Bonjour !
Je travaille actuellement sur mon moteur 3D perso. Alors actuellement je viens de finir la première partie de l'animation Skeletal de mes mesh (ça marche...) . Mais voilà maintenant je ne veut plus toucher a mes vertices & normals dans mon programme. Je veut passer par CG pour que ce soit la carte graphique qui s'en occupe. Et là j'ai un petit soucis avec CG. Dans un premier temp je veut juste changer la couleur de ma mesh : la faire passer de blanc à rouge.
voilà ce que je fait :
mon programme cg :
Bon alors, le problème ce n'est pas que mon modèle qui deviens rouge, mais tout l'écran... Alors j'ai récupéré les erreur que cg renvoie et la il me dit "invalid parameter handle" au sujet de la ligne cgGLSetParameterPointer() . (pas d'erreur pour tout le reste). Et la je vois pas trop...
Si vous avez une idée...
Merci
Message édité par Amonchakai le 12-11-2006 à 12:19:55