绘制到不同大小的FBO

时间:2014-11-20 01:08:29

标签: opengl opengl-es fbo render-to-texture

我在使用FBO时遇到问题。

我的窗口大小为1200x300。

当我创建一个1200x300的FBO时,一切都很好。

然而,当我创建尺寸为2400x600的FBO(实际上,在两个轴上都是两倍大)并尝试渲染完全相同的基元时,我只使用了FBO实际区域的四分之一。

FBO与窗口大小相同:

Same size

FBO两倍大(可以注意到三角形剪裁):

Different size

我将这两个三角形渲染成FBO,然后在其上渲染一个带有FBO纹理的全屏四边形。我用这种松绿色清除FBO,所以我确定第二张照片上的所有空白空间实际上来自FBO。

// init() of the program
albedo = new RenderTarget(2400, 600, 24 /*depth*/);  // in first case, params are 1200, 300, 24

// draw()
RenderTarget::set(albedo);   // render to fbo
RenderTarget::clearColor(0.0f, 0.3f, 0.3f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// render triangles ...
glDrawArrays(GL_TRIANGLES, 0, 6);

// now it's time to render a fullscreen quad
RenderTarget::set();   // render to back-buffer
RenderTarget::clearColor(0.3f, 0.0f, 0.0f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, albedo->texture());
glUniform1i(albedoUnifLoc, 0);
RenderTarget::drawFSQ();   // draw fullscreen quad

我没有任何类型的摄像机,我不会在任何地方使用glViewport,我总是发送基元的坐标以在单位平方空间中绘制(x和y坐标都在[ -1,1]范围)。

问题是,我做错了什么以及如何解决?

除了问题之外,glViewport是否与当前绑定的帧缓冲有关?据我所知,该功能仅用于设置绘图窗口中的矩形区域。

任何建议都将不胜感激。我尝试在线搜索问题,this SO question中唯一类似的问题,但它对我没有帮助。

1 个答案:

答案 0 :(得分:7)

您需要使用渲染目标的大小调用glViewport()。你可以在不调用它的情况下离开的唯一一次是当你渲染到窗口时,窗口永远不会调整大小。这是因为默认视口与初始窗口大小匹配。来自规范:

  

在初始状态下,w和h分别设置为GL进行渲染的窗口的宽度和高度。

如果要渲染到尺寸与窗口不同的FBO,则必须使用FBO的大小调用glViewport()。当你回到渲染窗口时,你需要再次调用glViewport()窗口大小。

每个帧缓冲状态的视口尺寸。我一直以为这是有道理的,但并没有这样定义。因此,无论何时调用glViewport(),您都在改变全局(即每个上下文)状态,与当前绑定的帧缓冲区无关。