OpenGL3.3:GLGetMultiSampleEV提供的值无效
我的代码是:OpenGL3.3:GLGetMultiSampleEV提供的值无效,opengl,Opengl,我的代码是: glGenFramebuffers(1, &_hFBO); glGenRenderbuffers(1, &(_hRender[colorAttachment])); glBindFramebuffer(GL_FRAMEBUFFER, _hFBO); glBindRenderbuffer(GL_RENDERBUFFER, _hRender[colorAttachment]); glRenderbufferStorageMultis
glGenFramebuffers(1, &_hFBO);
glGenRenderbuffers(1, &(_hRender[colorAttachment]));
glBindFramebuffer(GL_FRAMEBUFFER, _hFBO);
glBindRenderbuffer(GL_RENDERBUFFER, _hRender[colorAttachment]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, format, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 +colorAttachment,GL_RENDERBUFFER, _hRender[colorAttachment]);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glCheckFramebufferStatus(GL_FRAMEBUFFER);
glGetMultisamplefv(GL_SAMPLE_POSITION, p_index[0], val);
where,
Samples =4
format=GL_RGBA
width=height=512
p_index[0]=1
In this ,it is giving me GL_INVALID_VALUE for glGetMultisamplefv.
Note: If I call glCheckFramebufferStatus before attaching default frame buffer object (glBindFramebuffer(GL_FRAMEBUFFER, 0)) also, then it is not giving any error.
附加默认FBO之前是否需要检查GLCHECKFRAMEBERSTATUS。首先,调用
GLCHECKFRAMEBERSTATUS()
不会产生任何影响。它仅检查当前帧缓冲区的状态,如果帧缓冲区正常,则返回GL\u framebuffer\u COMPLETE
,否则返回各种可能的错误代码之一。因为您没有查看返回值,所以调用在代码片段中没有任何用途
按照我对代码的理解,您正在尝试查询刚刚设置的多采样FBO的示例位置。但代码并不是这样做的。由于在调用glGetMultisamplefv()
之前绑定了默认帧缓冲区,因此查询将应用于默认帧缓冲区。由于默认帧缓冲区不是多采样的,因此会出现错误
您需要做的主要事情是重新安排一些调用的顺序,主要是在绑定新FBO时调用glGetMultisamplefv()
:
glGenFramebuffers(1, &_hFBO);
glBindFramebuffer(GL_FRAMEBUFFER, _hFBO);
glGenRenderbuffers(1, &(_hRender[colorAttachment]));
glBindRenderbuffer(GL_RENDERBUFFER, _hRender[colorAttachment]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttachment,
GL_RENDERBUFFER, _hRender[colorAttachment]);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
// we got a problem
}
GLint sampleCount = 0;
glGetIntegerv(GL_SAMPLES, &sampleCount);
if (sampleCount == 0) {
// we got a problem
}
for (int sampleIdx = 0; sampleIdx < sampleCount; ++sampleIdx) {
GLfloat val[2] = {0.0f, 0.0f};
glGetMultisamplefv(GL_SAMPLE_POSITION, sampleIdx, val);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glGenFramebuffers(1,&uhfbo);
glBindFramebuffer(GL_帧缓冲区,_hFBO);
glGenRenderbuffers(1,&(_hRender[颜色附件]);
glBindRenderbuffer(GL_RENDERBUFFER,_hRender[颜色附件]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER,样本,GL_RGBA8,宽度,高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_颜色附件0+颜色附件、,
GL_RENDERBUFFER,_hRender[颜色附件];
如果(glCheckFramebufferStatus(GL\U FRAMEBUFFER)!=GL\U FRAMEBUFFER\U COMPLETE){
//我们有麻烦了
}
闪烁采样计数=0;
glGetIntegerv(GL_样本和样本计数);
if(sampleCount==0){
//我们有麻烦了
}
for(int-sampleIdx=0;sampleIdx
我还将renderbuffer的格式更改为RGBA8
,因为glRenderbufferStorage()
的internalformat
通常被认为是一种大小合适的格式
顺便说一句:不建议以下划线开头变量名。以下划线开头的名称保留供编译器和标准库内部使用。默认的帧缓冲区是多采样的吗?由于您在调用
glGetMultisamplefv()
之前绑定了默认帧缓冲区,因此该调用将从默认帧缓冲区而不是刚创建的FBO获取样本位置。另外,我相信glRenderBufferStorage()
可能需要一个大小合适的格式。尝试GL_RGBA8
而不是GL_RGBA
@RetoKoradi我将默认FBO称为glBindFramebuffer(GL_FRAMEBUFFER,0);。我不知道如何使它成为多样本,请让我知道如何做。没有运气,让我试着解释我的意思作为一个答案。不完全确定这是否是你想要的,但听起来可能是。