首先我的问题是:我试图渲染到FBO中的多个缓冲区。我使用glDrawBuffers
设置了多个缓冲区,并使用适当的gl_FragData
对其进行渲染。一切都很好,但在我的情况下,其中一个缓冲区应该向下采样,准确地说是四分之一(w/2
,h/2
)。
当然,我可以通过在之后对这些特定的缓冲区进行闪电战来实现这一点,也可以简单地在CPU上进行下采样(当前解决方案)。但后来我读了关于视口阵列的文章,在ARB规范中发现了这句话,这似乎正是我想要的,没有任何额外的转换。
此外,当与多个帧缓冲区附件组合时允许为每个视口选择不同的视口矩形。
当然,规范之后从未提及如何做到这一点或它们的实际含义,multiple framebuffer attachments
是相当通用的。我只注意到我可以将特定视口设置为几何体着色器的输出(输出gl_ViewportIndex
)。因此,我可以为阵列中的每个视口调用几何体两次。但据我所知,这只是调用应用了另一个视口变换的片段着色器,而不是每个目标缓冲区一个。当然,这对我的用例来说没有多大意义,而且我看不出这对每个帧缓冲区附件选择视口有什么帮助
对于我的情况,添加几何体着色器没有多大意义。由于视口变换仅在片段着色器之后应用,因此每个渲染目标都有一个视口是有意义的,前面的引用似乎证实了这一点。这真的有可能吗?如果有,我将如何实现这一点?
哦,我已经尝试了显而易见的方法:将该目标的渲染缓冲区(假设我使用GL_COLOR_ATTACHMENT1
)调整为下采样版本,并将视口阵列的索引1设置为相应的大小。最后我得到了图像左下象限的图片,基本上告诉我视口没有改变。
Viewport数组只能与几何体着色器一起使用;如果没有它们,数组索引0将用于所有渲染。
请记住:视口变换发生在光栅化之前。因此,如果要通过多个视口变换三角形,实际上是要求系统多次渲染该三角形。唯一的方法是使用多次输出基本体的几何体着色器。