2010-10-10 109 views
0

我正在试验渲染器。我想要的是写一个颜色缓冲区和一个正常的缓冲区到两个单独的纹理。我弄清楚了这一部分。OpenGL:使用多个纹理渲染为FBO

但是,颜色缓冲区应该是两个纹理的组合。这应该做的伎俩:

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); 

这是片段着色器(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); 
} 

然而,第二个纹理一样的第一!两个采样器都使用哪个纹理连接到GL_TEXTURE0

初始化FBO:

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); 

完整的渲染部分:

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); 

在此先感谢。

+0

请注意,在绑定渲染到的对象时,您不应该调用glActiveTexture或glEnable(GL_TEXTURE_2D)。您应该只在实际渲染应显示这些纹理的几何图形时(即渲染到纹理的结果)使用这些纹理。 – rdb 2014-05-24 16:48:06

回答

2

我想通了。 :)

我的纹理不起作用的原因是因为我没有设置统一的位置。固定代码:

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();