Bonjour tout le monde!
J'essaye de mettre en place des VBO avec OpenGL 3.x comme nous pouvons le voir sur les super tutos de bakura : Utilisation des VBO avec OpenGL 3.x.
Lors de l'implémentation de ces VBO, j'ai utilisé des shaders comme indiqué. Cependant j'ai un problème lors de la récupération de l'identifiant de mes attributs contenus dans le shader: j'obtiens la valeur -1.

Voici mon code pour charger mes shader (je suis en Java et j'utilise le binding LWJGL):
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
48
 
public void loadShader() {
        //new Shader2 appelle la méthode glCreateShader([I]type[\I]) 
	Shader2 vertexShader = new Shader2(GL20.GL_VERTEX_SHADER);
	Shader2 fragmentShader = new Shader2(GL20.GL_FRAGMENT_SHADER);
 
        //Lecture du fichier vbo.vs, le charge dans un String et appelle la 
        //méthode glShaderSource(idShader, source) 
	vertexShader.source("./shaders/vbo.vs");
	fragmentShader.source("./shaders/vbo.fs");
 
        //compile les shader avec glCompileShader(idShader)
	vertexShader.compile();
        //test si le shader est compilé en récupérant la valeur de 
        //glGetShader(idShader, GL_COMPILE_STATUS)
	vertexShader.isCompile();
 
	fragmentShader.compile();
	fragmentShader.isCompile();
 
        //new ShaderProgram2() fait appel à glCreateProgram()
	shaderProgram = new ShaderProgram2();
        //On attache les deux shader dans le programme 
        //(glAttachShader(idProgram, idShader)).
	shaderProgram.attachShader(vertexShader);
	shaderProgram.attachShader(fragmentShader);
 
        //On lie le programme
	shaderProgram.linkProgramShader();
 
        //On récupère l'identifiant de la matrice de notre scène
	uniformModelViewProjectionMatrix = shaderProgram.getUniformLocation("ModelViewProjectionMatrix");
 
        //On récupère l'id pour les couleurs, les position et les normales.
	vertexColorAttrib = shaderProgram.getAttribLocation("VertexColor");
	vertexPositionAttrib = shaderProgram.getAttribLocation("VertexPosition");
	vertexNormalAttrib = shaderProgram.getAttribLocation("VertexNormal");
 
        // Affiche : uniformModelViewProjectionMatrix: 0
	System.out.println("uniformModelViewProjectionMatrix: " + uniformModelViewProjectionMatrix); 
	// Affiche: vertexColorAttrib: -1
        System.out.println("vertexColorAttrib: " + vertexColorAttrib); 
       // Affiche: vertexNormalAttrib: -1
	System.out.println("vertexNormalAttrib: " + vertexNormalAttrib); 
 
      //Affiche: vertexPositionAttrib: 0
      System.out.println("vertexPositionAttrib: " + vertexPositionAttrib);
    }
Et voici mes deux shaders:
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
 
//Vertex Shader
#version 130
 
in vec3 VertexNormal;
in vec3 VertexPosition;
 
in vec3 VertexColor;
 
uniform mat4 ModelViewProjectionMatrix;
 
invariant gl_Position;
 
noperspective out vec3 NoPerspectiveColor;
 
void main()
{
    NoPerspectiveColor = VertexColor;
    gl_Position = ModelViewProjectionMatrix * vec4(VertexPosition, 1.0);
}
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
 
//Fragment Shader
#version 130
 
precision highp float;
 
smooth in vec3 InterpolatedColor;
 
// Sortie du fragment shader, ira dans le framebuffer principal
out vec4 Color;
 
void main()
{
    Color = vec4 (InterpolatedColor, 1.0);
}
Lors de l'ouverture de ma fenêtre, je ne vois mes données (ma fenêtre est toute noire alors que je l'ai initialisé avec glClearColor(1,1,1,1)...) . Je pensais au début que le problème venait des données que je passais dans les tableaux génériques mais ils sont correctement remplis. Je pense avoir trouvé l'origine du problème: les valeurs des identifiants de mes attributs ne sont pas correct du moins pour ceux des couleurs et normales (égaux à -1).

Avez-vous une idée de la cause? Et surtout comment remédier à ce problème?

Merci d'avance