我可以为每个渲染目标指定一个视口吗?

Posted

技术标签:

【中文标题】我可以为每个渲染目标指定一个视口吗?【英文标题】:Can I specify a viewport per render target? 【发布时间】:2012-08-01 18:51:18 【问题描述】:

首先我的问题:我正在尝试渲染到 FBO 中的多个缓冲区。我使用glDrawBuffers 设置多个缓冲区,并使用适当的gl_FragData 渲染给它们。一切都很好,但在我的情况下,其中一个缓冲区应该被下采样,准确地说是四分之一(w/2h/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 处于标准化坐标中这一事实感到困惑。”好吧,它不是。它是窗口空间像素坐标。

以上是关于我可以为每个渲染目标指定一个视口吗?的主要内容,如果未能解决你的问题,请参考以下文章

将视口渲染到纹理会产生重叠视口吗?

OpenGL ES 多目标渲染(MRT)

OpenGL 多重渲染目标 - 黑色输出

PhoneGap - 视口上的目标密度 dpi

你可以为不同的目标有两个同名的 ViewController 实现吗?

优维低代码:Redirect 路由重定向&If 条件渲染