Bonjour à tous,
je suis confronté à un problème concernant le rendu dans une texture et la gestion de sa couche alpha. J'utilise la méthode classique de dessin sur le framebuffer avec copie dans la texture via glCopyTexSubImage2D (utilisation des FBOs en cours d'implémentation). Pour tester/afficher la texture (composé d'un triangle simple), je dessine ensuite un quad occupant tout mon viewport, à l'aide d'un pixelshader (utilisation de la librairie CG, simple remplacement pixel à pixel) Tout fonctionne bien jusque là.
Or j'aimerais utiliser la composante alpha de ma texture pour pouvoir empiler plusieurs render to texture les uns sur les autres. Pour tester la couche alpha, je remplace dans mon shader le dessin du pixel (rgba) par le dessin de ce pixel (aaaa) pour pouvoir "voir" ma couche alpha. C'est là que ça se gate car j'obtiens à tous les coups une image blanche ...
J'aimerais dans un premier temps simplement dessiner cette couche alpha (en vue ensuite de pouvoir réaliser des opérations (alpha blending par exemple))
Merci pour votre aide !
Voici le code utilisé :
Initialisation de la texture (qui va contenir le rendu)
Dessin dans cette texture
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ... glPixelStorei(GL_UNPACK_ALIGNMENT,1); glGenTextures(1,&m_glName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT ); // m_width = m_height = 512 // pMyPictureData pointe sur un tableau d'octets (de valeur nulle) glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,m_width,m_height,0,GL_RGBA,GL_UNSIGNED_BYTE,pMyPictureData); ...
Dessin du quad sur le viewport entier
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 // le taille de la fenêtre est de 800x600 // m_width = m_height = 512 glViewport(0,0,m_width,m_height); glScissor(0,0,m_width,m_height); // Dessin d'un triangle 2D occupant la moitié du viewport // Fond jaune avec alpha à 0.0f glClearColor(1.0f,1.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); // Projection / Modelview glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ... // Dessin du triangle // Je suppose qu'à ce niveau là, les pixels occupés par le triangle ont une // composante alpha qui vaut 1, le reste valant 0. glBegin(GL_TRIANGLES); glColor3f(1.0f,0.0f,0.0f);glVertex2f(-0.5f,-0.5f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(-0.5f,0.5f); glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.5f,0.5f); glEnd(); // Upload vers la texture glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureId); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height); glDisable(GL_TEXTURE_2D);
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 glViewport(0,0,800, 600); glScissor(0,0,800, 600); glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Draw quad on main viewport glTranslatef(-1.0f,-1.0f,0.0f); glScalef(2.0f,2.0f,0.0f); // Code cg encapsulé // Dans le code d'init : // m_cgLayerTextureId = cgGetNamedParameter(mp_pixelShader->m_program, "layerTexture"); cgGLSetTextureParameter (m_cgLayerTextureId,textureId); cgGLEnableTextureParameter(m_cgLayerTextureId); mp_pixelShader->M_bind(); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f);glVertex2f(0.0f, 0.0f); glTexCoord2f(0.0f,1.0f);glVertex2f(0.0f, 1.0f); glTexCoord2f(1.0f,1.0f);glVertex2f(1.0f, 1.0f); glTexCoord2f(1.0f,0.0f);glVertex2f(1.0f, 0.0f); glEnd(); // Code cg encapsulé mp_pixelShader->M_unBind(); cgGLDisableTextureParameter(m_cgLayerTextureId); //Shader void main ( in float4 inColor: COLOR, in float4 position : POSITION, in float2 texcoord0 : TEXCOORD0, uniform in sampler2D layerTexture, out float4 outColor: COLOR ) { float4 texColor = tex2D( layerTexture, texcoord0 ); outColor.xyz = texColor.www; // dessin de la couche alpha }
Partager