【问题标题】:Why can't I render objects to texture properly using FBO?为什么我不能使用 FBO 将对象正确渲染到纹理?
【发布时间】:2010-03-26 18:46:16
【问题描述】:

我正在尝试使用 3 个 FBO 将场景渲染到纹理并显示带纹理的四边形来实现一个简单的程序。在投影到纹理四边形之前,我之前使用片段着色器成功完成了这项工作,但没有着色器就无法让它工作。有什么问题吗?
首先我设置我的纹理

glGenTextures(3, renderTextureID);

for (GLint i = 0; i < 3; i++)
{
    glBindTexture(GL_TEXTURE_2D, renderTextureID[i]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // this may change with window size changes
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
}

接下来是一些帧缓冲状态

glGenFramebuffersEXT(3, framebufferID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[0], 0);
GLenum fboStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if(fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT)
{
    fprintf(stderr, "FBO Error!");
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[1], 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[2]);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[2], 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

然后我渲染场景

glViewport(0, 0, fboWidth, fboHeight);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawModels();

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    ADDED: glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, renderTextureID[0]);

glEnable(GL_SCISSOR_TEST);
glViewport(windowWidth/2, 0, fboWidth, fboHeight);
glScissor(windowWidth/2, 0, fboWidth, fboHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_QUADS);
    glTexCoord2i(0, 0);
    glVertex2f(-1.0f, -1.0f);
    glTexCoord2i(1, 0);
    glVertex2f(1.0f, -1.0f);
    glTexCoord2i(1, 1);
    glVertex2f(1.0f, 1.0f);
    glTexCoord2i(0, 1);
    glVertex2f(-1.0f, 1.0f);
glEnd();

glDisable(GL_SCISSOR_TEST);
    ADDED: glDisable(GL_TEXTURE_2D);
glutSwapBuffers();

结果是一个黄色方块。如果不使用 FBO,绘制模型会绘制黄色线框立方体,所以问题不在于。我读过之前的一篇类似文章,其中谈到了在生成和绑定纹理后使用 glTexParameterf,但我已经这样做了。
谢谢...

【问题讨论】:

    标签: opengl


    【解决方案1】:

    我看不到最终缓冲区的任何内容。如果确实如此,并且您启用了 Z 测试,那么最终渲染缓冲区上的所有绘图(假设您使用相同的 Z 缓冲区)都将被 Z 拒绝。

    这是一个疯狂的猜测,因为仍然有很多代码丢失。我假设你没有任何 GL 错误?

    编辑添加: 您是否在固定功能中启用了纹理? glEnable(GL_TEXTURE_2D);

    【讨论】:

    • 没有总帐错误。如果我在绘制纹理四边形之前使用 glUseProgram 使用简单的片段着色器,那么输出就可以了,尽管如果我在调用 glUseProgram(0) 后尝试使用纹理,我会再次得到黄色方块
    • @Brett:那么这是您的固定功能设置的问题。我在答案中添加了另一个猜测。
    • 好的。所以我想我明白了。我在上面的原始代码中添加了 glEnable(GL_TEXTURE_2D),现在它可以工作了,谢谢 Bahbar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多