Bonjour,
J'essaie de comprendre les layered rendering avec les framebuffers mais j'ai un peu de mal.
J'essaie d'implémenter une cubemap (render to texture) mais tout ce que j'obtiens ce n'est qu'un cubemap noir et je n'arrive vraiment pas à comprendre pourquoi.
Mon but est de pouvoir dynamiquement changer la texture à chaque frame (comme générer des vagues, etc).
voici comment j'initialise la texture :
le framebuffer:
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 glGenTextures(1, &texture_cubemap); glBindTexture(GL_TEXTURE_CUBE_MAP, texture_cubemap); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
Et voici mes shaders :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 glGenFramebuffers(1, &_fbo); glBindFramebuffer(GL_FRAMEBUFFER, _fbo); for(i = 0; i < 6; i++) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_TEXTURE_CUBE_MAP_POSITIVE_X+i, texture_cubemap, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
le vertex shader ou j'envoie des vertices :
le geometry shader avec gl_layer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #version 330 layout (location = 0) in vec3 positionsPoints; uniform mat4 modelMatrix; uniform mat4 viewMatrix; uniform mat4 projectionMatrix; void main(){ gl_Position = vec4(positionsPoints, 1); }
et le fragment :
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 #version 330 layout(points) in; layout(points, max_vertices = 1) out; uniform mat4 projectionMatrix; //out vec3 fsotexCoord; out vec4 colorPoint; void main(void) { int i, layer; for (layer = 0; layer < 6; layer++) { gl_Layer = layer; for (i = 0; i < gl_in.length(); i++) { gl_Position = gl_in[0].gl_Position;//vec4(, 1);//projectionMatrix * colorPoint = vec4(1, 0, 0, 1); EmitVertex(); } EndPrimitive(); } }
Si je passe une array de vertices dans glTexImage2D (à la place de NULL) j'obtiens quelque chose et ça démontre que gl_layer ne fais rien et je ne comprend pas pourquoi... Je vous remercie d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #version 330 in vec4 colorPoint; out vec4 fragColor; void main() { fragColor = colorPoint; }
Cordialement,
Partager