如何在OpenGL中绘制镜像镜像?
从我的理解是,要在OpenGL中镜像,你基本上绘制场景,然后你翻转所有东西并再次绘制它,除了只通过镜子可见,从而在镜子中创建一个完美的翻转图像。 但我看到的问题是,当这样做时,唯一可以看到其他镜像的镜像是在之前的镜像之后渲染的镜像。 因此,如果我渲染镜像1然后镜像2,则镜像1看不到镜像2,但镜像2可以看到镜像1.如果没有这种情况,我如何有效地镜像镜像?
有两种常见的方法来渲染具有多个/递归reflection的reflection……
-
渲染到纹理并将该纹理应用于镜面。
这样做的一个优点是您可以使用前一帧中其他镜像的镜像纹理。 虽然这会引入很小的延迟,但是当您想要查看许多镜像时,它不会损害性能。 如果这是一个问题,您可以在主相机渲染之前重新渲染几次reflection纹理。
如果镜子不是完美的平面,您也可以使用此方法,例如,这适用于水中的涟漪。 实际上,这甚至可以使用立方体贴图进行扩展,以支持近似任意reflection。
- http://www.bonzaisoftware.com/tnp/gl-water-tutorial/ (过度杀伤平面reflection,但非常相关)
- http://ivanleben.blogspot.com.au/2008/03/water-reflections-with-opengl.html
- http://renderingwonders.wordpress.com/2011/01/03/chapter-08-%E2%80%93-buffer-objects-storage-is-now-in-your-hands-%E2%80%93- FBO纹理/
- http://cgvr.cs.uni-bremen.de/teaching/cg_literatur/Cube_map_tutorial/cube_map.html
-
门户渲染 ,正如您所说,使用模板缓冲区遮挡镜面,围绕镜像平面翻转场景,然后重新渲染。
镜像渲染只是门户渲染的一个特例。 这可以递归完成,但由于您必须正确管理深度缓冲区,因此它变得非常复杂。 您还需要一个场景的空间数据结构,因此您不必进行完全重新渲染,只需渲染您可以通过镜像看到的内容(或者它非常快速地变慢)。 如果你沿着这条路走下去,我建议你慢慢来,并包含大量的视觉调试,并使用简单直观的测试场景。
(有关单reflection模板缓冲区使用的页面很多,但这不是你想要的,所以我不打扰列出一些)
*请注意这些链接只是几分钟谷歌搜索的结果。 随意编辑和删除/添加。
最简单的方法是使用模板缓冲区。 看看这个页面 。
基本思路是:
- 渲染镜像表面并用1标记。
- 您重新渲染由镜像表面镜像的entrie场景(您可以使用矩阵执行此操作)并仅渲染模板缓冲区为1的位置(仅在镜像表面的位置有效绘制。
- 重复使用不同的值,或清除模板缓冲区以获取其他镜像。 如果你想要reflection其他镜子的镜子,你需要绘制另一个镜子表面,在模板缓冲区中用2标记它,但只有在它被读取的地方。
如果你有reflection镜子的镜子,你必须做所有可能的组合(首先渲染镜子1,然后在镜子1的reflection中镜像2,然后在原始场景中渲染镜子2,然后在镜子2的reflection中镜像1的reflection,依此类推。 ..)。
您无法使用此算法进行无限镜像reflection(仅限量reflection)。 只有光线跟踪可以做到这一点。