bonjours à tous
j'avais chercher une solution pour booster mes couleur de rendu par un shader, mais qui se fasse juste avant le swap-buffer. Pour cela, je fais le rendu de ma frame dans une texture, puis, je l'affiche sur l'ecran avec un shader qui modifie les couleur.
Le seul ennuis, c'est que lorsque je fais le rendu dans ma texture, le test de profondeur ne fonctionne pas comme prévu. Voici donc ici deux capture d'écran d'un terrain, l'un est directement rendu à l'écran, l'autre est dans une texture pour ensuite modifié les couleur.
Le code est exactement le même car pour fair le rendu dans la texture, je rajoute seulement avant et après juste le nécessaire pour que cela se fasse dans le fram-buffer.
Voici le code de la creation du fram buffer :
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
49
50
51 //DESSIN DIRECTE A L'ECRAN: void draw () { //mon code de dessin (bien trop long) } //DESSIN DANS LA TEXTURE PUIS AFFICHAGE: void draw () { glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, FramId); //toujours le même code de dessin glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureId, 0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); glBindTexture (GL_TEXTURE_2D, TextureId); glUseProgram (PostEffectShaderId); glLoadIdentity (); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, FramDimension.Width, 0.0, FramDimension.Height); glBegin (GL_TRIANGLES); glTexCoord2f (0.0, 1.0); glVertex2i (0, pFramDimension.Height); glTexCoord2f (1.0, 0.0); glVertex2i (FramDimension.Width, 0); glTexCoord2f (0.0, 0.0); glVertex2i (0, 0); glTexCoord2f (0.0, 1.0); glVertex2i (0, FramDimension.Height); glTexCoord2f (1.0, 0.0); glVertex2i (FramDimension.Width, 0); glTexCoord2f (1.0, 1.0); glVertex2i (FramDimension.Width, FramDimension.Height); glEnd (); }
Sur les captures d'écran, nous pouvons voir que le dessin de la carte s'effectue correctement quand c'est dessiné directement
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 void creatFramBuffer (size2i Size) { // -------------------------------- INIT TEXTURE glGenTextures (1, &TextureId); glBindTexture (GL_TEXTURE_2D, TextureId); glTexImage2D (GL_TEXTURE_2D, 0, 4, Size.Width, Size.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT); // -------------------------------- INIT BUFFER glGenFramebuffersEXT (1, &FramId); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, FramId); glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureId, 0); glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); }, tandis que sur le l'image au tendance plus rouge, qui est du à ma rectification, on vois que la carte à des problème de profondeur.
Même l'eau n'est plus affiché, tandis qu'elle est sensé être dessiné après la carte.
notes : La carte est dessinés par régions carré mise cote à cote qui sont stocké dans des vertex array, aucun stencil test.
Savez vous pourquoi j'ai se problème de test de profondeur ? Aurais je oublié quelque chose dans la création de fram-buffer ?
Je vous remercie de votre lecture ainsi que de vos réponses.![]()
Partager