如何在OpenGL中绘制镜像镜像?

时间:2013-12-11 05:57:42

标签: java opengl shader lwjgl

从我的理解是,要在OpenGL中镜像,你基本上绘制场景,然后你将所有东西翻转并再次绘制,除了只通过镜子使其可见,从而在镜子中创建一个完美的翻转图像。但是我看到的问题是,当这样做时,唯一可以看到其他镜像的镜像是在之前的镜像之后渲染的镜像。因此,如果我渲染镜像1然后镜像2,则镜像1看不到镜像2,但镜像2可以看到镜像1.如何在没有这种情况下有效地镜像镜像

2 个答案:

答案 0 :(得分:4)

有两种常见方法可以使用多次/递归反射来渲染反射 ......

  1. 渲染到纹理并将该纹理应用于镜面。

    这样做的一个优点是您可以使用前一帧中其他镜像的镜像纹理。虽然这会引入很小的延迟,但是当您想要查看许多镜像时,它不会影响性能。如果这是一个问题,您可以在主相机渲染之前重新渲染几次反射纹理。

    如果镜子不是完美的平面,您也可以使用此方法,例如,这适用于水中的涟漪。事实上,甚至可以使用立方体贴图来扩展它,以支持近似任意反射。

    enter image description here

  2. 门户渲染,正如您所说,使用模板缓冲区来遮挡镜面,翻转镜像平面周围的场景,然后重新渲染。

    镜像渲染只是门户渲染的一个特例。这可以递归完成,但由于必须正确管理深度缓冲区,因此它变得非常复杂。您还需要一个场景的空间数据结构,因此您不必进行完全重新渲染,只需渲染您可以通过镜像看到的内容(或者它非常快速地变慢)。如果你沿着这条路走下去,我建议你慢慢接受它并包含很多的可视化调试,并使用简单直观的测试场景。

    enter image description here

    (在单反射模板缓冲区使用上有很多页面,但这不是你想要的,所以我不打扰列出一些)

  3. *请注意这些链接只是几分钟谷歌搜索的结果。随意编辑和删除/添加。

答案 1 :(得分:1)

最简单的方法是使用模板缓冲区。看看这个page

基本理念是:

  • 渲染镜像表面并用1标记。
  • 您重新渲染entrie场景,由镜像表面镜像(您可以使用矩阵执行此操作)并仅渲染模板缓冲区为1的位置(仅在镜像表面的位置有效绘制。
  • 使用不同的值重复操作,或清除模板缓冲区以获取其他镜像。如果你想要反射其他镜子的镜子,你需要绘制另一个镜子表面,在模板缓冲区中用2标记它,但只在它被读取的地方。

如果你有镜子反射镜子,你必须做所有可能的组合(首先渲染镜子1,然后在镜子1的反射中镜像2,然后在原始场景中渲染镜子2,然后镜像1'反射在镜子2的反射中,依此类推......)。

使用此算法无法进行无限镜像反射(只有有限的反射量)。只有光线跟踪可以做到这一点。