首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制不同尺寸的FBO

绘制不同尺寸的FBO
EN

Stack Overflow用户
提问于 2014-11-20 01:08:28
回答 1查看 1.8K关注 0票数 3

我在使用FBO的时候有个问题。

我的窗户是1200x300。

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

但是,当我创建2400x600大小的FBO (实际上,在两个轴上都大了两倍)并试图呈现完全相同的原语时,我只使用了FBO实际面积的四分之一。

FBO与窗口大小相同:

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

我把这两个三角形渲染成FBO,然后用FBO的纹理渲染一个全屏四角。我用这个松绿色清除了FBO,所以我确信第二张图片上所有的空空间都来自FBO。

代码语言:javascript
复制
// 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,但它并没有帮助我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 02:03:46

您需要使用呈现目标的大小调用glViewport()。唯一不需要调用就可以离开的时间是当您呈现到窗口时,并且该窗口永远不会调整大小。这是因为默认的视图端口与初始窗口大小匹配。从规范中:

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

如果您想呈现给一个大小与您的窗口不同的FBO,您必须用FBO的大小调用glViewport()。当您回到呈现窗口时,需要再次调用具有窗口大小的glViewport()

每个框架缓冲区状态的视口维度是,而不是。我一直认为这是有意义的,但它不是这样定义的。因此,每当您调用glViewport()时,都会更改全局(即每个上下文)状态,而不依赖于当前绑定的框架缓冲区。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27030024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档