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

时间:2012-08-01 18:51:19

标签: opengl graphics viewport framebuffer

首先我的问题:我正在尝试渲染到FBO中的多个缓冲区。我使用glDrawBuffers设置多个缓冲区,并使用适当的gl_FragData渲染它们。一切都很好,但在我的情况下,其中一个缓冲区应该下采样,精确到四分之一(w/2h/2)。

当然,我之后可以通过blitting这些特定缓冲区来实现这一点,或者我可以简单地对CPU进行下采样(当前解决方案)。但后来我读到了关于视口数组并在ARB specification中找到了这个引用,这似乎正是我想要的,没有任何额外的转换。

  

此外,当与多个帧缓冲附件组合时,它   允许为每个视口矩形选择不同的视口矩形。

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

对于我的情况,添加几何着色器没有多大意义。并且由于视口变换仅在片段着色器之后应用,因此每个渲染目标具有视口是有意义的,前一个引用似乎已确认。这实际上是否可行,如果是这样,我将如何实现这一目标?

哦,我已经尝试过显而易见的事情了:将目标的渲染缓冲区大小调整(假设我使用GL_COLOR_ATTACHMENT1)到下采样版本,并将视口数组的索引1设置为相应的大小。我最终得到了图像左下象限的图片,基本上告诉我视口没有改变。

1 个答案:

答案 0 :(得分:4)

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

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