我一直在学习本教程中关于渲染到屏幕外纹理的内容,但在创建渲染目标时遇到了困难。我已经注册了一个错误回调函数,我用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
。