我的代码是:
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。?
答案 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:不建议使用下划线启动变量名称。以下划线开头的名称保留供编译器和标准库内部使用。