Super_DT

@Super_DT

  • 这也是一个花了我很久时间的问题,我一开始怀疑是用插值的法线会产生一些精度问题,这可能会导致不应该出现的多次迭代,我当时认为可能是法线的精度问题导致对交点进行加上 eps 矫正的时候使得交点反而在内表面而产生错误的迭代(比如单纯渲染一个任何参数都保持默认的 cube,交点被判断在了 cube 内,光线可能就会在 cube 内反复迭代)。不过这只能解释出现过暗的情况,我在使用插值的法线时也会出现奇怪的高光部分,我用 cube 实验的时候有些 kr 极度趋近于 1,这说明相机发出的光线与交点处法线接近垂直,而我设置的单光源和相机的位置是 222,理论上不应该出现这种接近垂直的情况。后来我输出 cube 的顶点法线(由 mesh.normal 调用得到,世界坐标系),很多法线并不是 001 并且有一定差距;而面片的法线是由顶点坐标计算而来,所以是正确的 001。

    使用 cube 正确法线进行渲染的结果
    QQ 图片 20231105221732|621x500
    使用 cube 插值得到的法线进行渲染的结果(也即 2.2 的结果)
    QQ 图片 20231105221726|620x500
    cube 的 obj 文件
    QQ 图片 20231105221846|421x500
    我并没有在 obj 文件中找到法线的数据,至于为什么 obj 文件没有法线数据却能直接得到顶点法线,我也不清楚。

    Post #2
  • 可以看 light.h,遍历 lights 列表就可以了

    Post #3