Bonjour à tous, je tente de généraliser un système de shadow mapping, opérationnel pour un spot, afin de le rendre opérationnel pour plusieurs. A cette fin, je souhaite remplacer ma TEXTURE_2D par une TEXTURE_2D_ARRAY dont chaque couche représenterait une shadow mappe. Je précise que je suis sous Opengl 3.3, GLSL 3.3, et en java. Mon code précédent de création du FBO et de la texture :
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 void initShadows(GLAutoDrawable drawable) { GL2 gl = (GL2)drawable.getGL(); shadow_tex = Buffers.newDirectIntBuffer(1); gl.glGenTextures(1, shadow_tex); this.shadow_fbo = Buffers.newDirectIntBuffer(1); gl.glGenFramebuffers(1, shadow_fbo); gl.glActiveTexture(GL2.GL_TEXTURE2); gl.glGenTextures(1, shadow_tex); gl.glBindTexture(GL2.GL_TEXTURE_2D, shadow_tex.get(0)); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_BORDER ); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_BORDER ); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_REF_TO_TEXTURE); gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_COMPARE_FUNC, GL2.GL_LESS); gl.glTexParameterfv(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_BORDER_COLOR, black, 0); gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_DEPTH_COMPONENT32, (int)shadowTexSizeX, (int)shadowTexSizeY, 0, GL2.GL_DEPTH_COMPONENT, GL2.GL_UNSIGNED_BYTE, null); gl.glBindTexture(GL2.GL_TEXTURE_2D,0); gl.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, this.shadow_fbo.get(0)); gl.glFramebufferTexture2D(GL2.GL_DRAW_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_TEXTURE_2D, this.shadow_tex.get(0), 0); }
est devenu :
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 gl.glGenTextures(1, shadow_tex); gl.glBindTexture(GL2.GL_TEXTURE_2D_ARRAY, shadow_tex.get(0)); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_BORDER ); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_BORDER ); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_REF_TO_TEXTURE); gl.glTexParameteri(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_COMPARE_FUNC, GL2.GL_LESS); gl.glTexParameterfv(GL2.GL_TEXTURE_2D_ARRAY, GL2.GL_TEXTURE_BORDER_COLOR, white, 0); gl.glTexImage3D(GL2.GL_TEXTURE_2D_ARRAY, 0, GL2.GL_DEPTH_COMPONENT32, (int)shadowTexSizeX, (int)shadowTexSizeY, (int)spotLights.size(), 0, GL2.GL_DEPTH_COMPONENT, GL2.GL_UNSIGNED_BYTE, null); gl.glBindTexture(GL2.GL_TEXTURE_2D_ARRAY, 0); gl.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, this.shadow_fbo.get(0)); gl.glFramebufferTextureLayer(GL2.GL_DRAW_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, this.shadow_tex.get(0), 0, 0);
et au moment de remplir la texture avec le tampon de profondeur, du point de vue de chaque spot :
Dans mon fragment shader, pour récupérer la valeur de ma shadowMap, j'ai transformé
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 void drawShadows(GLAutoDrawable drawable) { regenerateShadowMap = false; GL2 gl = (GL2)drawable.getGL(); gl.glEnable(GL2.GL_POLYGON_OFFSET_FILL); gl.glPolygonOffset(1.0f, 5.0f); gl.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, shadow_fbo.get(0)); gl.glClear(GL2.GL_DEPTH_BUFFER_BIT); gl.glColorMask(false, false, false, false); gl.glDisable(GL2.GL_BLEND); glFw.pushProjectionMatrix(); glFw.pushViewMatrix(); for(int i=0; i<spotLights.size(); i++) { gl.glViewport(0, 0, (int)shadowTexSizeX, (int)shadowTexSizeY); //le dernier parametre i correspond au layer de la textureArray gl.glFramebufferTextureLayer(GL2.GL_DRAW_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, this.shadow_tex.get(0), 0, i); ....... rendu de la scene du point de vue de chaque spot
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 uniform sampler2DShadow texShadow; ... vec4 shadowCoordinateWdivide = shadowCoord / shadowCoord.w; shadow = texture(texShadow, shadowCoordinateWdivide.xyz, 0.005f);
Même avec un seul spot (donc dans la même situation que précédemment), ça ne marche pas, je ne sais pas si c'est ma texture qui se remplit mal, ou si c'est sa lecture dans le shader. J'ai par ailleurs le plus grand mal à trouver de la documentation sur le fonctionnement des texture2dArray. Si vous avez des idées, ou besoin de plus de détail sur le code, n'hésitez pas, mais par pitiez aidez moi !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 uniform sampler2DShadowArray texShadow; vec4 shadowCoordinateWdivide = shadowCoord / shadowCoord.w; ... //i représente le layer de la texture, d'après ce que j'ai compris du GLSL reference, qui n'est pas très clair à ce sujet ! shadow = texture(texShadow, vec4(shadowCoordinateWdivide.xyz, i));![]()
Partager