从我的理解是,要在OpenGL中镜像,你基本上绘制场景,然后你将所有东西翻转并再次绘制,除了只通过镜子使其可见,从而在镜子中创建一个完美的翻转图像。但是我看到的问题是,当这样做时,唯一可以看到其他镜像的镜像是在之前的镜像之后渲染的镜像。因此,如果我渲染镜像1然后镜像2,则镜像1看不到镜像2,但镜像2可以看到镜像1.如何在没有这种情况下有效地镜像镜像?
答案 0 :(得分:4)
有两种常见方法可以使用多次/递归反射来渲染反射 ......
渲染到纹理并将该纹理应用于镜面。
这样做的一个优点是您可以使用前一帧中其他镜像的镜像纹理。虽然这会引入很小的延迟,但是当您想要查看许多镜像时,它不会影响性能。如果这是一个问题,您可以在主相机渲染之前重新渲染几次反射纹理。
如果镜子不是完美的平面,您也可以使用此方法,例如,这适用于水中的涟漪。事实上,甚至可以使用立方体贴图来扩展它,以支持近似任意反射。
门户渲染,正如您所说,使用模板缓冲区来遮挡镜面,翻转镜像平面周围的场景,然后重新渲染。
镜像渲染只是门户渲染的一个特例。这可以递归完成,但由于必须正确管理深度缓冲区,因此它变得非常复杂。您还需要一个场景的空间数据结构,因此您不必进行完全重新渲染,只需渲染您可以通过镜像看到的内容(或者它非常快速地变慢)。如果你沿着这条路走下去,我建议你慢慢接受它并包含很多的可视化调试,并使用简单直观的测试场景。
(在单反射模板缓冲区使用上有很多页面,但这不是你想要的,所以我不打扰列出一些)
*请注意这些链接只是几分钟谷歌搜索的结果。随意编辑和删除/添加。
答案 1 :(得分:1)
最简单的方法是使用模板缓冲区。看看这个page。
基本理念是:
如果你有镜子反射镜子,你必须做所有可能的组合(首先渲染镜子1,然后在镜子1的反射中镜像2,然后在原始场景中渲染镜子2,然后镜像1'反射在镜子2的反射中,依此类推......)。
使用此算法无法进行无限镜像反射(只有有限的反射量)。只有光线跟踪可以做到这一点。