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);。我不知道如何使它成为多样本,请让我知道如何做。没有运气,让我试着解释我的意思作为一个答案。不完全确定这是否是你想要的,但听起来可能是。