簡體   English   中英

OpenGL:使用多個紋理渲染到FBO

[英]OpenGL: Render to FBO using multiple textures

我正在嘗試渲染器。 我想要的是將顏色緩沖區和普通緩沖區寫入兩個單獨的紋理。 我把那部分弄清楚了。

但是,顏色緩沖區應該是兩個紋理的組合。 這應該做的伎倆:

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

提前致謝。

好吧,我想通了。 :)

我的紋理不起作用的原因是因為我沒有設置統一的位置。 固定代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM