在我的应用程序中,我渲染到附加到帧缓冲区对象的纹理。然后将帧缓冲区附件传输到屏幕。以下是代码的相关部分:
//initialization
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenTextures(1, &fboTexId);
glBindTexture(GL_TEXTURE_2D, fboTexId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTexId, 0);
GLuint rboDepth;
glGenRenderbuffers(1, &rboDepth);
glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return false;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//render loop
glViewport(0, 0, w, h);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glViewport(0, 0, w, h);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
render();
int sample_buffers = 0;
glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_SAMPLE_BUFFERS, &sample_buffers);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
sample_buffers = 0;
glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_SAMPLE_BUFFERS, &sample_buffers);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR);
上面的代码工作正常,但是当更改目标矩形时,例如:
glBlitFramebuffer(0, 0, w, h, 0, 0, w / 2, h / 2, GL_COLOR_BUFFER_BIT, GL_LINEAR);
我收到 OpenGL 错误 1282 - GL_INVALID_OPERATION。来自调试上下文的消息如下所示:
Error has been generated. GL error GL_INVALID_OPERATION in BlitFramebuffer: (ID: 3482180659) Generic error
文档说:
如果 GL_SAMPLE_BUFFERS 的值生成 GL_INVALID_OPERATION 对于读取或绘制缓冲区大于零,并且 源矩形和目标矩形的尺寸不相同。
但是生成的帧缓冲区和默认帧缓冲区的样本缓冲区等于 0。为什么我得到 GL_INVALID_OPERATION ?
该错误可能还有其他原因:
如果过滤器为 GL_LINEAR 并且读取,则会生成 GL_INVALID_OPERATION 缓冲区包含整数数据。
由于源矩形和目标矩形的大小不相等,似乎您应该使用
GL_NEAREST
或更改读取缓冲区的格式。