Bonjour tout le monde, je suis nouveau sur le site,
J'ai décidé de me mettre à OpenGL; et comme toutes les fonctionnalités du pipeline fixe sont dépréciées, je me suis mis directement à apprendre le fonctionnement du pipeline programmable.
J'ai commencé en douceur... un carré blanc.
Voici mon fragment shader :
Et voici mon vertex shader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // debut fragment shader : #version 130 precision highp float; in vec4 vertexColour; out vec4 pixelColour; void main() { pixelColour=vertexColour; } // fin fragment shader.
Jusque là, rien de folichon, on est d'accord. Voici un bout de mon code C++ pour que vous puissiez visualiser mes appels aux fonctions OpenGL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // debut vertex shader : #version 130 in vec2 vertexPosition; out vec4 vertexColour; void main() { vertexColour=vec4(float(1),float(1),float(1),0f); gl_Position=vec4(vertexPosition,float(0),float(1)); } // fin vertex shader.
J'utilise les bibliothèques glew (pour les extensions) et glfw (pour la gestion du fenêtrage)
Tout fonctionne impeccablement, j'ai bien mon carré blanc. Mais alors pourquoi ce post?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 // glew et glfw initialises, contexte OpenGL cree. // shaders deja charges, compiles et lies dans le programme nomme shaderProgramId. // ... // initialisation : glEnable(GL_DEPTH_TEST); glClearColor(0.0f,0.0f,0.0f,1.0f); unsigned int vaoId, vboIds[2]; glGenVertexArrays(1,&vaoId);// initialisation des vertex array objects glBindVertexArray(vaoId); glGenBuffers(2,vboIds);// initialisation des vertex buffer objects glBindBuffer(GL_ARRAY_BUFFER,vboIds[0]); const float vertexArray[]= { -0.9f,-0.5f, -0.4f,-0.5f, -0.4f,0.0f, -0.9f,0.0f }; glBufferData(GL_ARRAY_BUFFER,sizeof(vertexArray),vertexArray,GL_STATIC_DRAW);// passage des données de sommets dans le buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vboIds[1]); const char indexArray[]= { 0,1,2,3 }; glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexArray),indexArray,GL_STATIC_DRAW);// passage des indices des sommets dans le buffer /* gl_Vertex deprecated, recuperation des positions du sommet courant par l'attribut vec2 vertexPosition/* const unsigned int posLocation=glGetAttribLocation(shaderProgramId,"vertexPosition"); glEnableVertexAttribArray(posLocation); glVertexAttribPointer(posLocation,2,GL_FLOAT,false,2*sizeof(float)/*equivalent a 0...*/,0); // fin initialisation // rendu while(true)) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// "nettoie" l'affichage glUseProgram(shaderProgramId);// binding du programme glBindVertexArray(vaoId);// binding des buffers glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,0);// dessin //glDrawElementsInstancedARB(GL_QUADS,4,GL_UNSIGNED_BYTE,0,1); glfwSwapBuffers();// swap buffers } // fin rendu //
Eh bien, voici mon problème : dès que je souhaite accéder à la variable gl_VertexID (introduite avec l'extension GL_EXT_gpu_shader4), par exemple en rajoutant simplement :
dans le main de mon vertex shader, je n'ai plus rien qui s'affiche. Pourtant, OpenGL ne détecte aucune erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int vertexId=gl_VertexID;
En mettant «*#extension GL_EXT_gpu_shader4 : enable*» (ou «*require*») après «*#version 130*» dans le code du vertex shader (et même dans le code du fragment shader où c'est a priori inutile...), rien ne s'affiche non plus et aucune erreur n'est détectée. La variable gl_VertexID est bien reconnue puisque si je rajoute en plus «*#entension GL_EXT_gpu_shader4 : warn*», OpenGL me signale que je l'utilise, m'indiquant la ligne.
J'ai exactement le même problème avec la variable gl_InstanceIDARB (introduite avec GL_ARB_draw_instanced) même en changeant «*glDrawElements*» par «*glDrawElementsARB*», et là, ça m'embête beaucoup plus car l'instancing est une fonctionnalité que je trouve intéressante et j'aurais bien aimé pouvoir l'utiliser.
Je précise que j'ai compilé mon code source avec Mingw 5.4 et Visual C++ 2008 Express Edition, toujours pour le même résultat. J'ai même écrit un code équivalent en Java avec la bibliothèque de binding OpenGL LWJGL. Idem : je n'ai plus mon carré blanc lorsque j'essaie d'accéder aux variables gl_VertexID ou gl_InstanceIDARB.
Ma carte graphique est une radeon 3650 agp avec pilotes catalyst 9.4 (les derniers disponibles pour les cartes radeons agp). Mon OS est Windows XP sp3.
J'espère que vous pourrez m'aider. Je vous remercie d'avance de vous pencher sur mon problème.
Partager