gpt4 book ai didi

reflection - 如何用threejs实现逼真反射

转载 作者:行者123 更新时间:2023-12-05 05:26:22 29 4
gpt4 key购买 nike

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

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

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

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

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

Step1

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

Step2

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

Step3

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

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

据我所知,我应该为接收间接照明的 Material 编写自定义顶点和片段着色器,对吧?不幸的是我不知道从哪里开始,谁能指出我正确的方向?干杯。

最佳答案

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

  1. 光线追踪

    你必须使用光线追踪渲染(back ray-trace)来实现这一点。如果编码正确,这还将涵盖阴影、透明 Material 、反射照明等等。除非您还想进行精确的大气散射,否则就是这种方式。

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

    如果转换的光线碰到任何障碍物,那么它的颜色会改变(由于障碍物属性)并且新的光线被转换为反射光线。如果 Material 是透明的,那么也会转换折射光线......每次命中或折射都会影响光强度,因此当强度低于某个阈值或在某个递归层(限制每条射线的最大折射次数)时停止,以避免无限循环和你可以操纵性能/质量......

  2. 标准多边形渲染

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

  3. 立方体贴图

    您可以为每个对象使用立方体贴图。它与项目符号 2 类似,但在生成立方体贴图而不是每帧时只发生一次疯狂……如果对象太多,那么这也不是方法。您可以仅对具有反射表面的对象使用立方体贴图,以使其易于管理。此外,如果对象在移动,那么您必须时不时地重新生成立方体贴图 ...

关于reflection - 如何用threejs实现逼真反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724659/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com