glBlitFramebuffer 生成 GL_INVALID_OPERATION

问题描述 投票:0回答:1

在我的应用程序中,我渲染到附加到帧缓冲区对象的纹理。然后将帧缓冲区附件传输到屏幕。以下是代码的相关部分:

//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 ?

opengl
1个回答
0
投票

该错误可能还有其他原因:

如果过滤器为 GL_LINEAR 并且读取,则会生成 GL_INVALID_OPERATION 缓冲区包含整数数据。

由于源矩形和目标矩形的大小不相等,似乎您应该使用

GL_NEAREST
或更改读取缓冲区的格式。

© www.soinside.com 2019 - 2024. All rights reserved.