Bonjour,
J'ai un soucis avec la matrice de projection
le code principal : http://pastebin.com/wGwyzwkx
à la ligne 17, si je multiplie la matrice de projection par la gauche donc faire :
gl_Position = projection*view*modelview*vec4(in_position, 1.0);
ça m'affiche écran noir
si je laisse la ligne 17 telle quelle, ça m'affiche bien mon repère qui tourne, mais du coup je n'ai pas de matrice de projection
je ne comprends pas pourquoi ça m'affiche écran noir lorsque je multiplie par la matrice de projection, est-ce que je fais de mauvaises manipulation avec? ai-je oublié quelque chose ?
merci d'avance pour vos futures réponses
--
P.-S: je débute avec opengl 3.x, désolé d'avance si vous voyez des affreusetés dans le code, cependant si vous en voyez, n'hésitez pas à me l'indiquer
P.-P.-S: ligne 70;74 lorsque je met les sizeof(truc), je met ça de manière statique, car mes données sont statiques pour l'instant, mais je metterais ça propre et de manière dynamique plus tard lorsque je rajouterais mon parser de fichier dae
gl_Position=ftransform(); donne quelque chose de correct?
Sinon, je crois qu'il n'y a pas de matrice view en openGL. Juste la matrice ModelView et Projection. essaie d'enlever le view dans l'opération?
ChiageDeLuna je viens d'essayer, cela m'affiche écran noir
mais du coup, si je fais gl_Position=ftransform(); à aucun moment dans le pipeline je fais intervenir la position 3d du vertex courant, si?
pour ce qui est de la matrice view, avec
gl_Position = view*modelview*vec4(in_position, 1.0);
ça fonctionne
gl_Position = modelview*vec4(in_position, 1.0);
ça fonctionne
gl_Position = view*vec4(in_position, 1.0);
ça fonctionne
c'est lorsque je fais intervenir la matrice de projection que plus rien ne s'affiche :
gl_Position = projection*view*modelview*vec4(in_position, 1.0);
ne fonctionne pas
gl_Position = projection*view*vec4(in_position, 1.0);
ne fonctionne pas
gl_Position = projection*vec4(in_position, 1.0);
ne fonctionne pas
En fait ftransform applique l'opération de déformation du pipeline fixe, si je ne me plante pas. Ca évite d'écrire soi-même la formule. Je sèche, je ne suis pas expert dans le domaine, désolé.
Mais attend, je crois que t'as pas testé projection*modelview*vec4(in_position,1.0);
ChiageDeLuna merci pour tes réponses
j'avais aussi essayé avec projection*modelview*vec4(in_position,1.0), j'ai juste oublié de le précisé dans mon précédent message
je pense que ça ne peut venir que de la matrice de projection, lorsque je l'enleve ça m'affiche tout bien, lorsque que je la met ça ne m'affiche plus rien
concernant ftransform(), je n'ai pas très bien compris, quelque soit le pipeline la position 3d de mon vertex courant doit intervenir à un moment ou un autre dans la valeur de gl_Position si j'ai bien compris normalement, puis de toute manière ftransform() ne pourra pas être une solution à long terme car j'aurais besoin de ma matrice view pour la camera et ma matrice modelview pour les translations et rotations
Fov est en radian, donc 70 c'est beaucoup trop grand ;)
Ligne 40, essais 70 / 180.0 * 3.14 (ou la constante pi si il y en a une)
Met aussi des () dans le calcul:
gl_Position = projection * (view * (modelview * vec4(in_position, 1.0)))
Oups j'avais lu de travers la doc de glm, fov est pas forcement en radian!
Pilo1488 merci pour ta réponse
oui j'avais essayé en fait en radian et en degré (comme à la ligne 140 où cela fonctionne, car quand je met pas la matrice de projection, cela m'affiche bien une rotation du repère dessiné)
c'est juste que là dans mon code en Fov j'ai laissé en radian, parce que dans les 2 cas ça ne fonctionnait pas
j'ai essayé de mettre les parenthéses, ça m'affiche toujours rien
Oui ce soir je suis pas concentré je dis n'importe quoi
Je prends le risque d'une autre :
Ton lookat est en (0, 0, 0) et regarde en (1, 3, -10), es tu sur que tu puisse voir les lignes comme ca? (Je demande, car la reponse est peut etre oui )
Essaus peut etre de mettre la camera en (0, 0, 15) par exemple et le lookat a (0, 0, 0)
Pilo1488 alors je viens d'essayer de mettre la camera en (0,0,15) et de laisser le lookat à (0,0,0) mais ça ne m'affiche toujours rien
sinon oui, je suis sûr de pouvoir voir mon repère tourné avec la matrice view de mon code
pour le même code, lorsqu'à la ligne 17 j'ai:
gl_Position = view * (modelview * (vec4(in_position, 1.0)));
cela m'affiche le repère qui tourne autour de l'axe Y : http://pix.toile-libre.org/upload/original/1406666990.png
lorsqu'à la ligne 17 j'ai:
gl_Position = projection * (view * (modelview * (vec4(in_position, 1.0))));
cela m'affiche écran noir : http://pix.toile-libre.org/upload/original/1406667109.png
----
informations supplémentaires :
je passe par MESA, version utilisé : 3.3 (Core Profile) Mesa 10.3.0-devel (git-cce5814 trusty-oibaf-ppa)
je suis sur Xubuntu 14.04
j'ai récupéré le statut de compilation du vertex shader, et il me renvoie vrai et aucun log d'erreur, donc aucune erreur à la compilation du vertex shaders, je sais vraiment pas ce qu'elle a cette matrice de projection
Ok! J'essairai de compiler le code demain matin, ca doit une toute petite erreur!
D'accord, merci
sinon tout compile parfaitement en fait, le programme, et les 2 shaders
donc pour trouvé l'erreur je ne vois plus aucune approche
ah, je savais bien que ton pseudo me disait quelque chose, c'était toi qui m'avait aidé aussi il y a un an pour le parser de fichier wavefront obj
https://www.jeuxvideo.com/forums/1-31-8653998-1-0-1-0-opengl-parser-fichiers-obj-et-mtl.htm
merci encore
le parser c'était avec opengl 2.1 aussi, c'était pas du tout le même fonctionnement que opengl 3.x, du coup là je repars de zero avec opengl 3.x
Ah oui je me souviens
Tu aurais le code source complet pour que je puisse essayer de le faire tourner?
(il manque peut etre juste main avec l'initialisation de SDL dans ce que tu as mi sur pastebin?)
oui, voilà tout le projet :
https://github.com/stanoob/ParserColladaDAE
le code que j'ai mis sur pastebin est dans le fichier scenegl.cpp
la ligne qui fait défaut est la ligne 101
les autres fichiers c'est pour le parser de fichier dae que j'ai entrepris d'essayer de faire, d'ailleurs j'ai un probleme avec, mais j'en ferais un autre topic après ne plus avoir le probleme de matrice de projection
(j'allais faire une archive et upload ça sur mega.co.nz, mais au final je pense que c'est le bon moment pour apprendre à utiliser git)
dans ton code initial, tes coordonnées de vertices sont compris entre 0.0 et 1.0f
et tu as defini un near->far qui va de 1.0f à 100.0f
En theorie, tu ne dois rien voir car tes points sont tous avant ton plan "near".
Essai avec des coordonnées plus grands.
tu peux aussi vérifier les valeurs qui sont dans ta variable "projection"
Merci pour le code ;)
Donc c'est bien un simple problème de placement de camera (comme je te le disais, et comme le dit aussi Lapintade).
si tu met ca :
view = glm::lookAt(glm::vec3(0.0, 3.0, -5.0),
glm::vec3(0.0, 0.0, 0.0),
glm::vec3(0.0, 1.0, 0.0));
tu verra que tout marche comme il faut ;)
gl_Position = projection * view * modelview * vec4(in_position, 1.0);
P.S. : c'est la premiere fois que je compilais du code "pur" OpenGL 3 sur ma machine, j'ai utilisé GLEW (donc en enlevant les define que tu avait mis pour win32, pour que ca fonctionne aussi sous mon linux), et j'ai du rajouté ca avant le init de glew :
glewExperimental = GL_TRUE;
je sais pas si c'est necessaire sur d'autre plateforme, mais sous linux apparament oui (enfin, c'est sur que oui sinon les pointeurs sur les fonctions openGL ne sont pas setter).