Bonjour ,
J'ai un problème avec un fragment shader, et je n'ai trouvé aucune réponse satisfaisante sur Internet. En gros, je dois passer trois textures à un shader (les trois textures sont valides car je peux les afficher sans problème). Toutefois, lorsque je les passe au shader, seule la première fonctionne seulement si je supprime les deux autres. Dès que j'en met 2, aucune ne fonctionne. Idem pour 3. Voici un code minimal reproduisant l'erreur :
Le 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
16
17
18
19
20
21
22
23
24
25 glUseProgram (lightPyramidsTraversalProg); // Première texture sur l'unité 0 glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, lightPyramidsCreationPosition); GLuint texLoc1 = glGetUniformLocation(lightPyramidsTraversalProg, "lightPyramidsPosition"); glUniform1i(texLoc1, 0); // Seconde texture sur l'unité 1 glActiveTexture (GL_TEXTURE1); glBindTexture (GL_TEXTURE_2D, lightPyramidsCreationNormal); GLuint texLoc2 = glGetUniformLocation(lightPyramidsTraversalProg, "lightPyramidsNormal"); glUniform1i(texLoc2, 1); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, lightPyramidsTraversalFBO); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); DrawQuad (512.0, 512.0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); glUseProgram (0);
Pour le fragment shader :// Vertex shader
void main ()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
//gl_TexCoord[2] = gl_MultiTexCoord2;
//gl_TexCoord[3] = gl_MultiTexCoord3;
}
Concrètement, la seule façon pour que ça fonctionne c'est : de ne binder qu'une seule texture (donc appel à glActiveTexture (GL_TEXTURE0)). Si je bind même qu'une seule texture sur l'unité 1, ça ne fonctionne plus. Si j'en bind 2, une sur l'unité 0 et l'autre sur l'unité 1, plus aucune ne fonctionne.
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 // Fragment shader uniform sampler2D lightPyramidsPosition; uniform sampler2D lightPyramidsNormal; /*uniform sampler2D lightPyramidsIntensity; uniform sampler2D validityTexture; uniform float currentLevel; // Niveau actuel du mipmap uniform int currentResolution; // Resolution du niveau actuel du mipmap uniform int previousResolution; // Resolution du niveau précédent du mipmap*/ void main () { // float offset = 1.0 / currentResolution; vec3 finalColor = vec3 (0.0, 0.0, 0.0); // On récupère dans un premier temps la position, la normale et la couleur du pixel vec3 positionPixel = texture2D (lightPyramidsPosition, gl_TexCoord[0].st, 0.0).xyz; vec3 normalPixel = normalize (texture2D (lightPyramidsNormal, gl_TexCoord[1].st, 0.0).xyz); //vec3 colorPixel = texture2D (lightPyramidsIntensity, gl_TexCoord[2].st, 0.0).xyz; finalColor = positionPixel; gl_FragData[0] = vec4 (finalColor, 0.0); }
J'ai pourtant l'impression que le code est correct...
Partager