如何用threejs实现真实的反思

时间:2014-11-03 22:43:49

标签: reflection three.js shader physics lighting

我试图尽可能逼真地渲染一个场景,在该场景中,一个点光击中一个物体并以与面部法线相同的角度反射(入射角=反射角)并照亮其他地方的场景。

现在,我知道threejs中的反射通常是CubeCamera - 按照我在网上找到的例子处理的材料 - 但它并不完全适用于我的情况,因为我可能从一个点观察场景其中我可能无法观察到物体在另一个物体的镜子表面上的反射。

考虑this example prototype我正在研究:如果场景中从墙上突出的盒子有镜像材料(用CubeCamera完成),我将无法做到除非相机处于特定位置,否则看到绿色立方体在底面上的反射;然而,在现实生活中,如果被光源照射的物体在另一个物体附近通过,它将部分照亮它,好像它是一个光源本身(当然取决于物体的反射率指数)等等。从任何角度看,接收间接照明的物体都是可见的。

因此我提出了在立方体中添加PointLight的想法,但这当然会对周围环境产生不良影响。

我将尝试按以下顺序说明我的目标:

Step1

1)在这里,我将来称之为阳台的远端是正确的黑暗,而标有红色'x'的区域是立方体有孩子的结果{ {1}}向所有方向发光。

Step2

2)在这里,阳台的远面仍然是黑暗的,底部的正在接收更多的光,因为立方体经过,这是可取的,但立方体后面的墙应该实际上是黑暗的(我没有添加阴影然而,我首先想要照明正确,以及它下面的地面和灯柱。

Step3

3)最后,当立方体通过阳台时,阳台的侧面和底面被照亮是完全错误的,因为我们现在所有的反射光线都没有反弹 back 它的来源。同样适用于灯柱。

现在我意识到发生的所有错误都是由于立方体发光本身,我希望你可以帮助我的是确定一种产生物理精确反射光线的方法。
我想避免使用环境光或其他黑客来模拟现实生活场景并尽可能地坚持物理学;我怀疑我想要实现的是计算量很大的渲染,更不用说实时用例中的动画了,但这不是一个问题,因为我只是在尝试开发一个概念验证,而不是必然的东西表现得很快。

从我收集的内容来看,我应该为接收间接照明的材料编写自定义顶点和片段着色器,对吧?不幸的是我不知道从哪里开始,有人能指出我正确的方向吗?欢呼声。

1 个答案:

答案 0 :(得分:2)

如果您不想进入体积渲染,那么您有3个选项(我知道)

  1. <强>射线追踪

    您必须使用光线跟踪渲染(反光线跟踪)来实现此目的。如果编码正确,这也将涵盖阴影,透明材料,反射照明等等。除非你想做精确的大气散射,否则就是这样。

    • back raytracing 是每个屏幕像素的一(或3)条光线。它要快得多但不那么精确......(仍然足够精确)
    • 光线追踪是每个光源每个3D角度单位(球面度)空间的一条光线。它很慢但很精确(如果射线密度足够高)。

    如果铸造射线撞击任何障碍物,则其颜色会发生变化(由于障碍物属性),并且新射线被投射为反射光线。如果材料是透明的,那么折射光线也会被投射......每次击中或折射都会影响光线强度,因此当强度低于某个阈值或某些递归层(限制每条光线的最大折射数量)时,您将停止,以避免无限循环和你可以操纵性能/质量......

  2. 标准多边形渲染

    采用这种方法(我认为你现在正在使用它)你必须即兴发挥。可以类似于阴影技术完成反射和照明效果。对于每个曲面,您必须以反射方向渲染场景。阴影可以完成相同的操作,但您只需渲染到光照方向或使用阴影贴图。如果你有很多反射表面,那么这种方法也不是实现折射反射的方法,你必须递归渲染,使每个多边形多次渲染​​,这也是疯狂的。

  3. <强>立方体贴图

    您可以为每个对象使用立方体贴图。它类似于子弹2,但疯狂只进行一次生成立方体贴图而不是每帧...如果你有太多的物体,那么这也不是那样的。您只能将立方体贴图用于具有反射表面的对象,以使其易于管理。此外,如果对象正在移动,那么您必须偶尔重新生成立方体贴图...