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

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

有两种常见的方法来渲染具有多个/递归reflection的reflection……

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

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

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

    在此处输入图像描述

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

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

    在此处输入图像描述

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

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

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

基本思路是:

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

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

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