Abs*_*thm 2 opengl fbo opengl-es render-to-texture
我在使用FBO时遇到了问题.
我的窗口大小是1200x300.
当我创建一个1200x300的FBO时,一切都很好.
但是,当我创建尺寸为2400x600的FBO(实际上,两个轴上的两倍大)并尝试渲染完全相同的基元时,我只使用了FBO实际区域的四分之一.
FBO与窗口大小相同:

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

我将这两个三角形渲染成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
Run Code Online (Sandbox Code Playgroud)
我没有任何类型的摄像机,我没有glViewport在任何地方使用,我总是发送在单位方形空间中绘制的基元的坐标(x和y坐标都在[-1,1]范围内).
问题是,我做错了什么以及如何解决?
除了问题,是否glViewport与当前绑定的帧缓冲有关?据我所知,该功能仅用于在将要进行绘图的窗口上设置矩形区域.
任何建议将不胜感激.我尝试在线搜索问题,唯一类似的问题是在这个问题中,但它没有帮助我.
您需要glViewport()使用渲染目标的大小调用.你可以在不调用它的情况下离开的唯一一次是当你渲染到窗口时,窗口永远不会调整大小.那是因为默认视口与初始窗口大小匹配.从规格:
在初始状态中,w和h分别设置为GL要进行渲染的窗口的宽度和高度.
如果要渲染到与窗口大小不同的FBO,则必须使用FBO的大小进行调用glViewport().当你回到窗口渲染时,你需要再次调用glViewport()窗口大小.
视口尺寸不是每帧缓冲状态.我一直以为这是有道理的,但并没有这样定义.因此,无论何时调用glViewport(),您都在改变全局(即每个上下文)状态,而与当前绑定的帧缓冲区无关.