尝试绑定帧缓冲区或附加渲染缓冲区时操作无效
Invalid Operation when attempting to bind framebuffer, or attach render buffer
我正在尝试创建帧缓冲区以便渲染场景然后对其应用滤镜,但是当我尝试绑定到任何新创建的帧缓冲区或将渲染缓冲区附加到其中之一。
我像这样创建了帧缓冲区和渲染缓冲区:
GLuint frameBuffer[2];
glGenFramebuffers(2, frameBuffer);
//generate colorbuffer for normal rendering and brightness
GLuint colorBuffer[2];
glGenTextures(2, colorBuffer);
for (unsigned int i = 1; i > -1; i--)
{
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[i]);
glBindTexture(GL_TEXTURE_2D, colorBuffer[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 800, 800, 0, GL_RGB, GL_FLOAT, NULL); //800x800 window
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// attach texture to framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer[i], 0);
}
//currently frameBuffer[0] should be bound rn
GLuint rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 800); //800x800 window
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); //attach the renderbuffer
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
cout << "No Framebuffer" << endl;
}
当我检查帧缓冲区是否完整时,它没有抛出错误,所以我认为它是完整的,但是
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
引发无效操作错误。
稍后在程序中尝试使用glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[0]);
也会导致无效操作错误,无论我是否尝试将渲染缓冲区绑定到它。
我是 opengl 的新手,我不完全确定我做错了什么。我认为这与帧缓冲区生成有关。如果您需要更多信息,请随时询问。
您的 for
循环永远不会执行,因此 frameBuffer[0]
永远不会被绑定,这与您的预期相反。
i
是无符号的,因此条件被评估为 1 > 4294967295
,它总是 false
。如果你想用一个无符号变量向后迭代一个范围(这有时是必要的),那么你可以通过:
for (unsigned int i = 2; i --> 0;)
但是我没有看到在您的代码中向后迭代的特殊原因,因此您可以简单地将循环重写为:
for (unsigned int i = 0; i < 2; ++i)
我正在尝试创建帧缓冲区以便渲染场景然后对其应用滤镜,但是当我尝试绑定到任何新创建的帧缓冲区或将渲染缓冲区附加到其中之一。
我像这样创建了帧缓冲区和渲染缓冲区:
GLuint frameBuffer[2];
glGenFramebuffers(2, frameBuffer);
//generate colorbuffer for normal rendering and brightness
GLuint colorBuffer[2];
glGenTextures(2, colorBuffer);
for (unsigned int i = 1; i > -1; i--)
{
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[i]);
glBindTexture(GL_TEXTURE_2D, colorBuffer[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 800, 800, 0, GL_RGB, GL_FLOAT, NULL); //800x800 window
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// attach texture to framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer[i], 0);
}
//currently frameBuffer[0] should be bound rn
GLuint rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 800); //800x800 window
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); //attach the renderbuffer
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
cout << "No Framebuffer" << endl;
}
当我检查帧缓冲区是否完整时,它没有抛出错误,所以我认为它是完整的,但是
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
引发无效操作错误。
稍后在程序中尝试使用glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer[0]);
也会导致无效操作错误,无论我是否尝试将渲染缓冲区绑定到它。
我是 opengl 的新手,我不完全确定我做错了什么。我认为这与帧缓冲区生成有关。如果您需要更多信息,请随时询问。
您的 for
循环永远不会执行,因此 frameBuffer[0]
永远不会被绑定,这与您的预期相反。
i
是无符号的,因此条件被评估为 1 > 4294967295
,它总是 false
。如果你想用一个无符号变量向后迭代一个范围(这有时是必要的),那么你可以通过:
for (unsigned int i = 2; i --> 0;)
但是我没有看到在您的代码中向后迭代的特殊原因,因此您可以简单地将循环重写为:
for (unsigned int i = 0; i < 2; ++i)