光线追踪器存在视觉Bug?红色球体反射长条状物体成因咨询
问题分析:红色球体反射中的长条状物体成因

我不确定这是Bug还是正常现象,对红色球体反射中出现的长条状物体感到困惑,想了解其成因。
场景代码
s = Scene( [ Light( type_=LightType.ambient, intensity=vec3(0.2, 0.2, 0.2) ), Light( type_=LightType.point, intensity=vec3(0.6, 0.6, 0.6), position=vec3(2, 1, 0) ), Light( type_=LightType.directional, intensity=vec3(0.2, 0.2, 0.2), direction=-vec3(1, 4, 4) ), ], [ Triangle(vec3(-1.5, 0.5, 5.2), vec3(1.5, 0.5, 5.2), vec3(-1.5, 2, 4), vec3(0, 0, 0), 500, 1), Triangle(vec3(1.5, 0.5, 5.2), vec3(1.5, 2, 4), vec3(-1.5, 2, 4), vec3(0, 0, 0), 500, 1), Sphere( color=u8vec3(255, 0, 0), radius=1, center=vec3(0, -1, 3), specular=500, reflective = 0.2 ), Sphere( color=u8vec3(0, 0, 255), radius=1, center=vec3(2, 0, 4), specular=500, reflective=0.3 ), Sphere( color=u8vec3(0, 255, 0), radius=1, center=vec3(-2, 0, 4), specular=10, reflective=0.4 ), Sphere( color=u8vec3(255, 255, 0), radius=5000, center=vec3(0, -5001, 0), specular=1000, reflective=0.5 ) ] )
完整代码可查看对应项目代码。
成因分析
红色球体反射中出现的长条状物体属于光线追踪实现中的典型数值精度误差伪影,大概率由以下原因导致:
三角形相交计算的数值不稳定
红色球体后方有两个黑色三角形组成的矩形平面,当球体表面的反射光线擦过三角形边缘或接近与平面平行时,浮点计算的精度误差会导致相交点计算错误,进而在反射画面中形成拉伸的长条状失真。反射光线的自我相交误判
反射光线从红色球体表面出发时,若未给光线起点添加微小偏移(避免因浮点精度问题误判为与球体自身相交),会导致光线追踪逻辑异常,产生这类扭曲的反射伪影。高光参数放大误差
红色球体的高光指数(specular)设置为500,属于极高高光参数,这类参数会放大数值计算的微小误差,在反射区域形成异常的长条状失真。
解决方向:可以在反射光线出发时添加微小偏移量(如epsilon=1e-5),优化三角形相交算法的数值稳定性,或者降低极端高光参数测试是否缓解问题。
内容的提问来源于stack exchange,提问作者LINUX_ADMIN
相关产品推荐
相关产品推荐

