OpenGL:GL_FRAMEBUFFER_UNSUPPORTED帧缓冲附件的特定组合
OpenGL: GL_FRAMEBUFFER_UNSUPPORTED on specific combinations of framebuffer attachments
我试图将多个目标附加到帧缓冲对象。我有以下问题:
使用浮动纹理附件和深度附件时没有错误。使用浮点纹理附件和整数纹理附件时也没有错误。尽管这些组合有效,但我不能同时使用浮点数、整数和深度附件。这将导致GL_FRAMEBUFFER_UNSUPPORTED
状态。
这是我的代码:
//working:
Framebuffer fb = Framebuffer(
1280,720,
{
//AttachmentInfo(GL_DEPTH_COMPONENT16,GL_DEPTH_ATTACHMENT),
AttachmentInfo(GL_RG32F,GL_COLOR_ATTACHMENT0),
AttachmentInfo(GL_RGB16UI,GL_COLOR_ATTACHMENT1),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT2),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT3),
AttachmentInfo(GL_RGBA16F,GL_COLOR_ATTACHMENT4),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT5),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT6),
}
);
//working:
Framebuffer fb = Framebuffer(
1280,720,
{
AttachmentInfo(GL_DEPTH_COMPONENT16,GL_DEPTH_ATTACHMENT),
AttachmentInfo(GL_RG32F,GL_COLOR_ATTACHMENT0),
//AttachmentInfo(GL_RGB16UI,GL_COLOR_ATTACHMENT1),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT2),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT3),
AttachmentInfo(GL_RGBA16F,GL_COLOR_ATTACHMENT4),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT5),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT6),
}
);
//NOT working:
Framebuffer fb = Framebuffer(
1280,720,
{
AttachmentInfo(GL_DEPTH_COMPONENT16,GL_DEPTH_ATTACHMENT),
AttachmentInfo(GL_RG32F,GL_COLOR_ATTACHMENT0),
AttachmentInfo(GL_RGB16UI,GL_COLOR_ATTACHMENT1),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT2),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT3),
AttachmentInfo(GL_RGBA16F,GL_COLOR_ATTACHMENT4),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT5),
AttachmentInfo(GL_RGB32F,GL_COLOR_ATTACHMENT6),
}
);
注意:我仅在使用 NVidia GTX 970 显卡时收到此错误。在稍旧的ATI卡上未发生错误。
我使用glbinding
在每次gl*
函数调用后调用glGetError
,所以我知道没有发生其他错误。
这是我Framebuffer
对象的构造函数代码:
Framebuffer::Framebuffer(uint width,uint height,initializer_list<AttachmentInfo> attachments)
:width(width),height(height)
{
glGenFramebuffers(1,&fbID);
glBindFramebuffer(GL_FRAMEBUFFER,fbID);
if(std::none_of(attachments.begin(),attachments.end(),[](const AttachmentInfo& a){
return a.attachment == GL_DEPTH_ATTACHMENT;
})){
//depth test needs either a depth renderbuffer or depth attachment.
unsigned int rboID=0;
glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,rboID);
}
vector<GLenum> buffers;
glActiveTexture(GL_TEXTURE0);
for(AttachmentInfo attachment:attachments){
GLuint tID;
glGenTextures(1, &tID);
glBindTexture(GL_TEXTURE_2D,tID);
GLint param;
glGetInternalformativ(GL_TEXTURE_2D, attachment.internalFormat, GL_FRAMEBUFFER_RENDERABLE, 1, ¶m);
if(param != GL_FULL_SUPPORT){
_log(WARNING,"Internal format " << attachment.internalFormat << " support is " << GLenum(param) << ".");
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GLint(GL_LINEAR));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLint(GL_LINEAR));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GLint(GL_CLAMP_TO_EDGE));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GLint(GL_CLAMP_TO_EDGE));
if(attachment.attachment == GL_DEPTH_ATTACHMENT){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GLint(GL_COMPARE_REF_TO_TEXTURE));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GLint(GL_LESS));
}
glTexStorage2D(GL_TEXTURE_2D,1,attachment.internalFormat,width,height);
glFramebufferTexture(GL_FRAMEBUFFER, attachment.attachment, tID, 0);
if(Tools::startsWith(glbinding::Meta::getString(attachment.attachment),"GL_COLOR_ATTACHMENT")){
buffers.push_back(attachment.attachment);
}
texMap[attachment.attachment]=new Texture(tID,GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,0);
}
if(buffers.empty()){
buffers.push_back(GL_NONE);
}
glDrawBuffers(buffers.size(),buffers.data());
GLenum error=glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(error != GL_FRAMEBUFFER_COMPLETE){
_log(ERROR,"Framebuffer error: " << error);
}
unbind();
}
我真的不知道我能做些什么来让它工作......
我真的不知道我能做些什么来让它工作......
您的 OpenGL 实现告诉您,您选择的配置不受支持。你必须接受这一点。OpenGL规范并不要求所有实现都支持特定的格式组合,因此,如果您希望编程具有可移植性和健壮性,如果遇到GL_FRAMEBUFFER_UNSUPPORTED错误,则必须逐步降低格式要求,直到找到可行的组合。
关于支持的内容的一个很好的提示是枚举创建OpenGL上下文支持的所有FBConfig;通常这是允许的FBO配置的子集。
以防其他人像我一样遇到这个问题。支持的格式的确切组合因 OpenGL 实现而异,但任何实现都必须支持一组格式。如果您坚持这些,则不必担心便携性。这些要求在 OpenGL wiki 中关于帧缓冲完整性和所需图像格式的描述。
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 组合字符串不适用于 libCurl,C++
- 测试两个类型列表中的所有组合
- 将多个 for 循环组合成单个迭代器
- 如何从组合指数中找到仓位
- 防止组合框被关闭
- 如何解决可能的唯一组合问题