GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 正在尝试创建多重采样帧缓冲区
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT trying to create multisample framebuffer
我正在尝试弄清楚如何创建处理多重采样的帧缓冲区对象。下面是我试图让它工作的尝试,但是每当我检查我的帧缓冲区状态时,我总是收到 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 错误。即使我仅附加颜色缓冲区或仅附加 depth/stencil 缓冲区,我也会收到此错误。
我从没有多重采样的旧版本改编了这段代码,它能够创建一个完整的帧缓冲区。我留下了那些旧电话,但将它们注释掉了。
如何正确设置?
void DocumentPanel::setupFramebuffer()
{
QOpenGLFunctions_3_3_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
int w = width();
int h = height();
int samples = 16;
if (_frameBufferID == 0)
{
f->glGenFramebuffers(1, &_frameBufferID);
f->glBindFramebuffer(GL_FRAMEBUFFER, _frameBufferID);
}
if (_texBufferColor == 0)
{
// generate texture
f->glGenTextures(1, &_texBufferColor);
f->glBindTexture(GL_TEXTURE_2D, _texBufferColor);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
f->glBindTexture(GL_TEXTURE_2D, 0);
// attach it to currently bound framebuffer object
// f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texBufferColor, 0);
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor, 0);
}
if (_renderBufferDepthStencilID == 0)
{
f->glGenRenderbuffers(1, &_renderBufferDepthStencilID);
f->glBindRenderbuffer(GL_RENDERBUFFER, _renderBufferDepthStencilID);
// f->glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, w, h);
f->glBindRenderbuffer(GL_RENDERBUFFER, 0);
f->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _renderBufferDepthStencilID);
}
GLenum status = f->glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
//error
QString err;
switch (status)
{
case GL_FRAMEBUFFER_UNDEFINED:
err = "GL_FRAMEBUFFER_UNDEFINED";
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
err = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :
err = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :
err = "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER :
err = "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER ";
break;
case GL_FRAMEBUFFER_UNSUPPORTED :
err = "GL_FRAMEBUFFER_UNSUPPORTED ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :
err = "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS :
err = "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS ";
break;
}
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
qDebug() << "Error building frambuffer: " << err;
return;
}
//Rendering to window again
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
GL_TEXTURE_2D
和 GL_TEXTURE_2D_MULTISAMPLE
是不同的纹理目标。您的代码将纹理绑定到 GL_TEXTURE_2D
,但随后尝试通过 GL_TEXTURE_2D_MULTISAMPLE
对其进行操作,这是行不通的。
相反,您应该将 ALL 目标更改为 GL_TEXTURE_2D_MULTISAMPLE
:
f->glGenTextures(1, &_texBufferColor);
f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor);
f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
我正在尝试弄清楚如何创建处理多重采样的帧缓冲区对象。下面是我试图让它工作的尝试,但是每当我检查我的帧缓冲区状态时,我总是收到 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 错误。即使我仅附加颜色缓冲区或仅附加 depth/stencil 缓冲区,我也会收到此错误。
我从没有多重采样的旧版本改编了这段代码,它能够创建一个完整的帧缓冲区。我留下了那些旧电话,但将它们注释掉了。
如何正确设置?
void DocumentPanel::setupFramebuffer()
{
QOpenGLFunctions_3_3_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
int w = width();
int h = height();
int samples = 16;
if (_frameBufferID == 0)
{
f->glGenFramebuffers(1, &_frameBufferID);
f->glBindFramebuffer(GL_FRAMEBUFFER, _frameBufferID);
}
if (_texBufferColor == 0)
{
// generate texture
f->glGenTextures(1, &_texBufferColor);
f->glBindTexture(GL_TEXTURE_2D, _texBufferColor);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
f->glBindTexture(GL_TEXTURE_2D, 0);
// attach it to currently bound framebuffer object
// f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texBufferColor, 0);
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor, 0);
}
if (_renderBufferDepthStencilID == 0)
{
f->glGenRenderbuffers(1, &_renderBufferDepthStencilID);
f->glBindRenderbuffer(GL_RENDERBUFFER, _renderBufferDepthStencilID);
// f->glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, w, h);
f->glBindRenderbuffer(GL_RENDERBUFFER, 0);
f->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _renderBufferDepthStencilID);
}
GLenum status = f->glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
//error
QString err;
switch (status)
{
case GL_FRAMEBUFFER_UNDEFINED:
err = "GL_FRAMEBUFFER_UNDEFINED";
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
err = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :
err = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :
err = "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER :
err = "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER ";
break;
case GL_FRAMEBUFFER_UNSUPPORTED :
err = "GL_FRAMEBUFFER_UNSUPPORTED ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :
err = "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE ";
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS :
err = "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS ";
break;
}
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
qDebug() << "Error building frambuffer: " << err;
return;
}
//Rendering to window again
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
GL_TEXTURE_2D
和 GL_TEXTURE_2D_MULTISAMPLE
是不同的纹理目标。您的代码将纹理绑定到 GL_TEXTURE_2D
,但随后尝试通过 GL_TEXTURE_2D_MULTISAMPLE
对其进行操作,这是行不通的。
相反,您应该将 ALL 目标更改为 GL_TEXTURE_2D_MULTISAMPLE
:
f->glGenTextures(1, &_texBufferColor);
f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor);
f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);