c-为什么OpenGL帧缓冲区颜色附件不完整



我一直在学习本教程中关于渲染到屏幕外纹理的内容,但在创建渲染目标时遇到了困难。我已经注册了一个错误回调函数,我用GL_DEBUG_SOURCE_API源返回了一个GL_DEBUG_TYPE_OTHER错误,glCheckNamedFramebufferStatus()用消息抛出了这个错误:

FBO不完整:颜色附件不完整[0]。

我很难看到这里缺少了什么,我已经仔细检查了传递到OpenGL函数的参数,并尝试删除glTexParameteri调用,但没有成功。

如有任何帮助,我们将不胜感激。

GLuint framebuffer = 0;
GLuint renderedTexture;
GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENTS0};
bool buildOffscreenBuffer()
{
// creating frame & render texture to draw picker buffer to
glGenFramebuffers(1,  &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenTextures(1, &renderedTexture);
                        
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                        
// configuring framebuffer
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
renderedTexture, 0);
glDrawBuffers(1, drawBuffers);
                        
return glCheckNamedFramebufferStatus(framebuffer, GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
}

更新:根据derhass的回答,根据规范,似乎不需要GL_RGB。我曾尝试将其更新为GL_RGBA,但我遇到了同样的错误。由于这可能与实现有关,我将列出我的卡和驱动程序:

卡片:RX Vega 56

驱动程序:mesa/amdgpu

根据GL规范,GL_RGB不在所需的可渲染格式集合中,因此实现可以自由地不支持它。请尝试GL_RGBA

设法弄清了真相。实际上,我已经在简化帖子的示例时修复了这个错误。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080,
0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

实际上是从平台层的助手函数中获取宽度和高度,但该函数返回了一个struct {int, int},我将其存储在struct {float, float}中。这导致垃圾作为宽度和高度传递给glTexImage2D

最新更新