Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 如何用threejs实现真实的反射_Reflection_Three.js_Shader_Physics_Lighting - Fatal编程技术网

Reflection 如何用threejs实现真实的反射

Reflection 如何用threejs实现真实的反射,reflection,three.js,shader,physics,lighting,Reflection,Three.js,Shader,Physics,Lighting,我试图尽可能真实地渲染一个场景,其中点光源击中一个对象并以与面法线相同的角度(入射角=反射角)反弹,并照亮其他地方的场景 现在,我知道threejs中的反射通常是根据我在网上找到的示例处理的CubeCamera-材质,但它并不完全适用于我的情况,因为我可能是从一个点观察场景,在这个点上,我可能无法观察到另一个物体的镜面反射 考虑一下我正在做的工作:如果场景中从墙上突出的盒子有镜面材质(使用CubeCamera),我将无法看到绿色立方体在底面上的反射,除非相机位于特定位置;然而,在现实生活中,如果

我试图尽可能真实地渲染一个场景,其中点光源击中一个对象并以与面法线相同的角度(入射角=反射角)反弹,并照亮其他地方的场景

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

考虑一下我正在做的工作:如果场景中从墙上突出的盒子有镜面材质(使用
CubeCamera
),我将无法看到绿色立方体在底面上的反射,除非相机位于特定位置;然而,在现实生活中,如果一个被光源照亮的物体经过另一个光源附近,它将部分照亮它,就好像它本身就是一个光源一样(当然,这取决于物体的反射率指数),并且从接收间接照明的物体从任何角度都可以看到这种现象

因此,我想到了在立方体中添加一个
点光源
,但这当然会对周围环境产生不良影响

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

1) 在这里,我以后将称之为阳台的远侧是正确的黑暗,而标有红色“x”的区域是立方体有一个向各个方向发光的子
点光源的结果

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

3) 最后,当立方体经过阳台时,阳台的侧面和底面被照亮是完全错误的,因为我们现在都知道,反射的光线不会以其来源的方式反弹回来。这同样适用于灯柱

现在我意识到所有发生的错误都是由于立方体本身发光的事实,我希望你能帮助我确定一种产生物理上精确的反射光线的方法。
我希望避免使用环境光或其他黑客来模拟现实生活场景,并尽可能坚持物理;我怀疑我想要实现的是非常繁重的渲染计算,更不用说在实时用例中制作动画了,但这不是一个问题,因为我只是试图开发一个概念证明,而不是一些必须快速执行的东西


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

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

  • 光线跟踪

    必须使用光线跟踪渲染(反向光线跟踪)来实现这一点。如果编码正确,这还将覆盖阴影、透明材质、反射照明等。除非你想做精确的大气散射,否则这就是方法

    • 反向光线跟踪是每个屏幕像素一条(或三条)光线。速度快得多,但不是那么精确。。(仍然足够精确)
    • 光线跟踪是指每个光源空间的每个3D角度单位(立体线)中有一条光线。它很慢但很精确(如果光线密度足够高)
    如果投射的光线碰到任何障碍物,则其颜色将发生更改(由于障碍物属性),新光线将投射为反射光线。如果材质是透明的,那么折射光线也会被投射。。。每次命中或折射都会影响灯光强度,因此当强度低于某个treshold或某个递归层(限制每光线的最大折射数)时停止,以避免无限循环,并且可以操纵性能/质量

  • 标准多边形渲染

    有了这种方法(我想你现在正在使用它),你必须即兴发挥。反射和照明效果可以与阴影技术类似。对于每个曲面,必须以反射方向渲染场景。同样可以对阴影进行处理,但只需渲染到灯光方向或使用阴影贴图即可。如果反射曲面的数量非常多,那么这种方法也不是实现折射反射的方法,必须递归渲染,使每个多边形具有多个渲染过程,这也是非常疯狂的

  • cubemap

    可以对每个对象使用立方体贴图。它类似于bullet 2,但疯狂只在生成立方体贴图而不是每帧时执行一次。。。如果你有太多的对象,那么这也不是办法。为了便于管理,只能对具有反射曲面的对象使用立方体贴图。此外,如果对象正在移动,则必须每隔一段时间重新生成立方体贴图


  • 好吧,听起来我可能想使用光线跟踪,一种“缓慢但精确”的方法;关于如何使用THREE.js实现它,有什么线索吗?@AndreaAloi我没有用JAVA编写代码,所以我不能帮上忙。使用任何2D像素API(如画布)(用于SW渲染)或使用OpenGL+GLSL+GLM。仅当需要照片级真实感/光度控制精度时才使用光线跟踪。反向光线跟踪可以实时完成,结果非常接近,所以通常最好选择它。。。此外,这两个引擎都是相似的,所以如果结果对您来说不够好,您可以不费吹灰之力将backraytrace重写为raytrace