2010-10-10 2 views
0

J'expérimente avec un moteur de rendu. Ce que je veux, c'est écrire un tampon de couleur et un tampon normal à deux textures séparées. J'ai compris cette partie.OpenGL: Rendre à FBO en utilisant plusieurs textures

Cependant, le tampon de couleur est censé être une combinaison de deux textures. Cela devrait faire l'affaire:

glActiveTexture(GL_TEXTURE0_ARB); 
glEnable(GL_TEXTURE_2D); 
g_Tex->Bind(); 

glActiveTexture(GL_TEXTURE1_ARB); 
glEnable(GL_TEXTURE_2D); 
g_TexNormal->Bind(); 

    g_Shader->Enable(); 
     RenderScene(); 
    g_Shader->Disable(); 

glActiveTexture(GL_TEXTURE1_ARB); 
glDisable(GL_TEXTURE_2D); 

glActiveTexture(GL_TEXTURE0_ARB); 
glDisable(GL_TEXTURE_2D); 

Et c'est le fragment shader: (GLSL)

uniform sampler2D tex_diffuse; 
uniform sampler2D tex_normal; 

void main() 
{ 
    gl_FragColor = texture2D(tex_diffuse, gl_TexCoord[0].st); 
    //gl_FragColor = texture2D(tex_normal, gl_TexCoord[0].st); 
} 

Cependant, la deuxième texture est le même que le premier! La texture qui est attachée à GL_TEXTURE0 est celle utilisée pour les deux échantillonneurs.

Initialiser le OIR:

glGenFramebuffersEXT(1, &g_FBOColor); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_FBOColor); 

glGenTextures(1, &g_FBOTexColor); 
glBindTexture(GL_TEXTURE_2D, g_FBOTexColor); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_FBOTexColor, 0); 

glGenTextures(1, &g_FBOTexNormal); 
glBindTexture(GL_TEXTURE_2D, g_FBOTexNormal); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, g_FBOTexNormal, 0); 

glGenTextures(1, &g_FBOTexDepth); 
glBindTexture(GL_TEXTURE_2D, g_FBOTexDepth); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); 
glBindTexture(GL_TEXTURE_2D, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, g_FBOTexDepth, 0); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

section complète render:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_FBOColor); 
glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT); 

glViewport(
    0, 0, 
    Window::GetSingleton()->GetWidth(), Window::GetSingleton()->GetHeight() 
); 

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; 
glDrawBuffers(2, buffers); 
//glReadBuffer(GL_COLOR_ATTACHMENT0_EXT | GL_COLOR_ATTACHMENT1_EXT); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glActiveTexture(GL_TEXTURE0_ARB); 
glEnable(GL_TEXTURE_2D); 
g_Tex->Bind(); 

glActiveTexture(GL_TEXTURE1_ARB); 
glEnable(GL_TEXTURE_2D); 
g_TexNormal->Bind(); 

    g_Shader->Enable(); 
     RenderScene(); 
    g_Shader->Disable(); 

glActiveTexture(GL_TEXTURE1_ARB); 
glDisable(GL_TEXTURE_2D); 

glActiveTexture(GL_TEXTURE0_ARB); 
glDisable(GL_TEXTURE_2D); 

glPopAttrib(); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

Merci à l'avance.

+0

Notez que vous ne devez pas appeler glActiveTexture ou glEnable (GL_TEXTURE_2D) lorsque vous les liez à rendre. Vous ne devriez les utiliser que lorsque vous êtes en train de rendre la géométrie qui devrait afficher ces textures (c'est-à-dire le résultat de la texture de rendu). – rdb

Répondre

2

Eh bien, je l'ai compris. :)

La raison pour laquelle mes textures n'ont pas fonctionné était parce que je n'ai pas mis en place les emplacements uniformes. Code fixe:

g_Shader->Enable(); 

    glActiveTexture(GL_TEXTURE0_ARB); 
    glEnable(GL_TEXTURE_2D); 
    g_Tex->Bind(); 
    glUniform1i(glGetUniformLocation(g_Shader->GetProgram(), "tex_diffuse"), 0); 

    glActiveTexture(GL_TEXTURE1_ARB); 
    glEnable(GL_TEXTURE_2D); 
    g_TexNormal->Bind(); 
    glUniform1i(glGetUniformLocation(g_Shader->GetProgram(), "tex_normal"), 1); 

     RenderScene(); 

    glActiveTexture(GL_TEXTURE1_ARB); 
    glDisable(GL_TEXTURE_2D); 

    glActiveTexture(GL_TEXTURE0_ARB); 
    glDisable(GL_TEXTURE_2D); 

g_Shader->Disable(); 
Questions connexes