这是我正在尝试执行的主程序:
.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与窗口大小完全相同。
答案 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);