OpenGL3.3:glGetMultisamplefv给出无效值

时间:2014-06-03 10:22:59

标签: opengl

我的代码是:

   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之前是否需要检查glCheckFramebufferStatus。?

1 个答案:

答案 0 :(得分:1)

首先,glCheckFramebufferStatus()电话根本不应该有所作为。它仅检查当前帧缓冲区的状态,如果帧缓冲区正常则返回GL_FRAMEBUFFER_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);

我还会将渲染缓冲区的格式更改为RGBA8,因为internalformat的{​​{1}}通常应该是一个大小适中的格式。

BTW:不建议使用下划线启动变量名称。以下划线开头的名称保留供编译器和标准库内部使用。