我可以为每个渲染目标指定一个视口吗?
Posted
技术标签:
【中文标题】我可以为每个渲染目标指定一个视口吗?【英文标题】:Can I specify a viewport per render target? 【发布时间】:2012-08-01 18:51:18 【问题描述】:首先我的问题:我正在尝试渲染到 FBO 中的多个缓冲区。我使用glDrawBuffers
设置多个缓冲区,并使用适当的gl_FragData
渲染给它们。一切都很好,但在我的情况下,其中一个缓冲区应该被下采样,准确地说是四分之一(w/2
,h/2
)。
当然,我可以通过事后对这些特定缓冲区进行 blitting 来做到这一点,或者我可以简单地在 CPU 上进行下采样(当前解决方案)。但后来我阅读了有关视口数组的信息,并在ARB specification 中找到了这句话,这似乎正是我想要的,没有任何额外的转换。
此外,当与多个帧缓冲区附件结合使用时,它 允许为每个选择不同的视口矩形。
当然,规范之后从未提及如何执行此操作或它们的实际含义,multiple framebuffer attachments
是相当通用的。我只注意到我可以将特定视口设置为几何着色器的输出(输出gl_ViewportIndex
)。所以我可以为数组中的每个视口调用几何两次。但据我了解,这将简单地调用片段着色器并应用另一个视口转换,而不是每个目标缓冲区一个。这当然对我的用例没有多大意义,我也看不出这如何有助于为每个帧缓冲区附件选择视口
对于我的情况,添加几何着色器没有多大意义。而且由于视口变换仅在片段着色器之后应用,因此每个渲染目标都有一个视口确实有意义,前面的引用似乎证实了这一点。这真的可能吗?如果可以,我将如何做到这一点?
哦,我已经尝试了显而易见的方法:将该目标的渲染缓冲区(假设我使用 GL_COLOR_ATTACHMENT1
)调整为下采样版本,并将视口数组的索引 1 设置为相应的大小。我最终得到了图像左下象限的图片,基本上告诉我视口没有改变。
【问题讨论】:
"并且视口变换只在片段着色器之后应用" 视口变换在光栅化之前应用,而不是在片段着色器之后。 【参考方案1】:视口数组只能与几何着色器一起使用;没有它们,数组索引 0 将用于所有渲染。
记住:视口变换发生在光栅化之前。因此,如果您想通过多个视口变换三角形,您实际上是在要求系统渲染该三角形多次。而做到这一点的唯一方法是使用多次输出图元的几何着色器。
【讨论】:
当然它适用于光栅化,这对我来说很愚蠢:s,我对gl_FragCoord
处于标准化坐标中这一事实感到困惑。你知道他们当时对那句话的意思吗,因为我仍然不明白你怎么能有一个每个附件的视口?
@KillianDS:正如它所说的那样:几何着色器可以将单个三角形发送到individual attached layered images,并为每个三角形提供不同的视口。视口和图像层之间的连接不是自动的;这一切都在 GS 中完成。
啊哈,那么使用gl_Layer
,谢谢(我对几何着色器的经验很少)。我想我会坚持使用 CPU 或 blit-solution,复制片段计算不是一个直接的选择。谢谢。
“我对 gl_FragCoord 处于标准化坐标中这一事实感到困惑。”好吧,它不是。它是窗口空间像素坐标。以上是关于我可以为每个渲染目标指定一个视口吗?的主要内容,如果未能解决你的问题,请参考以下文章