对Framebuffer的OpenGL渲染会产生白色矩形纹理

时间:2015-12-27 10:42:10

标签: c++ opengl framebuffer

这是我正在尝试执行的主程序:

.env

然而,除了纹理,我看到一个白色的矩形。如果我在屏幕上渲染,我会得到预期的结果(因此渲染代码应该没有问题)。这是FrameBuffer类:

FrameBuffer* buffer = new FrameBuffer(960, 540);
buffer->Bind();
// render some textures
buffer->Unbind();
glViewport(0, 0, 960, 540);

Texture* texture = buffer->GetTexture();
// render the texture

其他所有内容都经过测试,因此问题应该在主程序的逻辑或FrameBuffer中。

顺便说一下,视口大小iz与窗口大小完全相同。

1 个答案:

答案 0 :(得分:2)

假设您的create方法中的评论是正确的,这将无效:

        m_Texture = new Texture(width, height, 32);  // This creates a 32 bit depth texture with GL_TEXTURE_MIN_FILTER and GL_TEXTURE_MAG_FILTER set to linear

        glBindFramebuffer(GL_FRAMEBUFFER, m_FrameBufferID);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture->GetTextureID(), 0);

您无法将深度纹理附加到颜色缓冲区。纹理格式GL_DEPTH_COMPONENT*GL_DEPTH*_STENCIL*永远不会颜色可渲染

我不知道评论是否只是一个错字,你打算创建一个标准的RGB或RGBA颜色纹理,或者你真的想要深度缓冲区的纹理。在后一种情况下,您可以将其附加到深度附着点(而不是像您当前那样使用渲染缓冲区)。然后,您可以执行仅深度渲染过程,并且根本不需要颜色缓冲区。

但也许您只需要一个32位纹理通道,并且可以使用格式GL_R32F,以便可以存储片段着色器输出的r通道。您还可以将每个片段gl_FragDepth存储在颜色缓冲区中(但这可能不如直接使用深度附件和深度纹理那样高效,特别是因为您基本上仍需要使用深度缓冲区实际深度测试)。

        glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBufferID);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthBufferID);