Bonjour,
Je suis actuellement en train de mettre en place la méthode de shadowmapping pour générer des ombres. A priori au niveau des transformations et des matrices utilisées, je pense ne pas avoir de problème parce que lorsque je suis dans la passe de rendu, j'arrive à afficher la profondeur de chaque fragment par rapport à la lumière (bien qu'il semble y avoir un problème de clamping.
Seulement, j'essaye de lire les valeurs de ma shadowmap, mais cela me donne un affichage étrange que je n'arrive pas à interprêter. Je commence donc à douter de ma shadowmap, mais je ne trouve pas de moyen de la vérifier étant donner que c'est calculé offscreen.
Voici donc mon code :
Initialisation de la shadowmap et de son FBO
Première passe : calcul de la shadowmap avec le shader associé :
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 bool ShadowMapFBO::initUndeprecated(unsigned int WindowWidth, unsigned int WindowHeight) { // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. glGenFramebuffers(1, &m_fbo); glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); // Depth texture. Slower than a depth buffer, but you can sample it later in your shader glGenTextures(1, &m_shadowMap); glBindTexture(GL_TEXTURE_2D, m_shadowMap); glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, WindowWidth, WindowHeight, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_shadowMap, 0); glDrawBuffer(GL_NONE); // No color buffer is drawn to. // Always check that our framebuffer is ok if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) return false; return true; } //Bind de la Shadowmap pour écriture avant la première passe (écriture de la shadowmap et Bind de la SM pour lecture avant la passe de rendu : void ShadowMapFBO::BindForWriting() { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo); } void ShadowMapFBO::BindForReading(GLenum TextureUnit) { glActiveTexture(TextureUnit); glBindTexture(GL_TEXTURE_2D, m_shadowMap); }
Vertex Shader de génération de la ShadowMap :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void GLScene::computeShadowMap() { m_shadowmap.BindForWriting(); glClear(GL_DEPTH_BUFFER_BIT); // La projection light et la projection camera sont identiques m_map.draw(projection, cameraview, lightview, m_shadowMapShader, m_gridShader, false, false); glBindFramebuffer(GL_FRAMEBUFFER, 0); }
FS :
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 #version 330 in vec3 VertexPosition; in vec3 VertexNormal; in vec2 VertexTextCoord; // Here, MVP from light space are received uniform mat4 projection; uniform mat4 model; uniform mat4 lightview; void main() { // generation shadow map gl_Position = projection * lightview * model * vec4(VertexPosition.xyz, 1.0); }
Ma question est la suivante : En mettant simplement dans le FragmentShader un float en sortie, est-on sur qu'OPenGL sait qu'il doit écrire dans la DepthTexture qui a été bindée précédemment ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #version 330 out float fragmentDepth; void main() { // computes a shadowmap fragmentDepth = gl_FragCoord.z; }
Comment puis-je faire pour m'assurer que cette ShadowMap est bien calculée ?
Merci d'avance !
Partager