2012-08-01 60 views
0

首先我的问题:我试图渲染到FBO中的多个缓冲区。我使用glDrawBuffers设置多个缓冲区,并使用适当的gl_FragData对它们进行渲染。一切都很好,但在我的情况下,其中一个缓冲区应该采用下采样方式,精确到四分之一(w/2h/2)。我可以为每个渲染目标指定一个视口吗?

当然,我可以通过事后处理那些特定的缓冲区来做到这一点,或者我可以简单地对CPU执行下采样(当前解决方案)。但后来我读到了有关视口数组的内容,并在ARB specification中找到了这个引用,这看起来正是我想要的,没有任何额外的转换。

另外,当具有多个帧缓冲区附件相结合,它 允许为每个要被选择的不同的视口矩形。

当然,规范从来没有提到如何做到这一点或他们实际上的含义,multiple framebuffer attachments是相当通用的。我只注意到我可以将特定视口设置为几何着色器的输出(输出gl_ViewportIndex)。所以我可以为数组中的每个视口调用两次几何。但据我所知,这只会调用片段着色器与另一个视口转换应用,而不是每个目标缓冲区一个。这当然对我的用例没有多大意义,我也看不出如何有助于为每个帧缓冲区选择一个视口。

对于我的情况,添加几何着色器没什么意义。由于视口变换仅适用于片段着色器之后,因此每个渲染目标都有一个视口是有意义的,而前面的引用似乎证实了这一点。这实际上是可能的,如果是这样,我将如何实现这一目标?

哦,我已经试过了明显已经:调整这一目标的渲染(比方说我用GL_COLOR_ATTACHMENT1)下采样版本和设置视数组的索引1到根据大小。我最终拍摄了图像左下象限的图片,基本告诉我视口没有变化。

+0

“而且视口转换仅适用于片段着色器之后”视口转换在光栅化之前应用,而不在片段着色器之后应用。 – 2012-08-01 20:13:51

回答

3

视口数组只能用于几何着色器;没有它们,数组索引0将用于所有渲染。

请记住:视口转换发生在光栅化之前。因此,如果要通过多个视口变换三角形,则实际上要求系统多次渲染该三角形。唯一的方法是使用几何着色器多次输出原语。

+0

当然,它被应用于光栅化,这对我来说很愚蠢:s,我被'gl_FragCoord'处于标准化坐标这一事实弄糊涂了。你有什么想法,那么他们可能意味着什么,因为我还没有看到你如何拥有每个附件的视口? – KillianDS 2012-08-02 06:19:23

+0

@KillianDS:完全可以这样说:几何着色器可以将单独的三角形发送到[单独附加的分层图像](http://www.opengl.org/wiki/Framebuffer_Object#Layered_Images),并为每个三角形赋予不同的视口。视口和图像层之间的连接不是自动的;这一切都在GS中完成。 – 2012-08-02 06:31:28

+0

啊哈,然后使用'gl_Layer',谢谢(我对几何着色器的使用经验很少)。我想我会坚持CPU或blit-solution,重复片段计算不是一个直接的选择。谢谢。 – KillianDS 2012-08-02 06:35:33

相关问题