如何渲染镜子或其他反射表面?


16

我只是想知道如何在3D游戏中创建镜像?我的建议是/是要追踪光线,击中“镜子”对象,然后将第二个凸轮的图片绘制到位于原始相机的镜子“点”上的“镜子”对象上,方法是将镜子对象的撞击面用作镜像平面。

我们将不得不使用来自原始相机中心的一束光线来确定视觉中心在镜面上的位置。


1
您想对此事物进行“素描”吗?
daemonfire300 2010年

您可以尝试将其发布在stackoverflow.com上,因为它与游戏开发无关。也许那里有更多的图形专家可以为您提供帮助。
莉吉特

Answers:


14

如果您使用的是OpenGL,则OpenGL常见问题解答第9节:转换确切介绍了如何执行此操作。不,它不涉及光线追踪,因为可以理解,这是一种非常低效(但质量很高)的方式来完成此任务。

9.170如何渲染镜子?

本质上,这是FAQ条目所说的,示例代码演示了:

  • 设置反射视图矩阵。在第二段中说明了如何对轴对齐的反射镜进行此操作。
  • 绘制场景
  • 恢复视图矩阵并清除深度缓冲区
  • 再次渲染场景;该场景中的实际镜子几何形状应该是半透明的或完全透明的,以便显示到先前渲染的镜像场景。

显然,有很大的优化空间。渲染反射场景时,您可能应该尽可能地进行剔除,因为反射镜通常很小,并且默认的屏幕外剔除不会针对屏幕上显示但看不到镜子的几何图形进行。您也可以通过镜子渲染场景的简化版本。为了获得效果并避免用户注意到质量降低,可以在执行镜像渲染时应用着色器(例如,模糊或亮/褪色)。

我想,如果您使用的是DirectX,则过程将大致相同。


3
如果您的内存多于渲染时间,另一种方法是简单地通过3D编辑器中的镜子反映您的世界几何体,然后您可以对其进行修改以使其看起来像您想要的(强制较低的Mip级别等)。我们在PS1上进行了此操作,将坐在发光的地板上的东西复制/倒置到地下,地板本身变为半透明的。
dash-tom-bang 2010年

请注意,示例代码是指已弃用的OpenGL规范。但是,概念是通用的,并且可以使用最新的OpenGL 规范类似地应用。
patryk.beza 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.