我编写了一个简单的光线跟踪器(代码为here,但您不必调试它)。它可以渲染简单的网格物体:
我觉得它看起来很酷。光线跟踪器中没有反射,并且像素仅根据其内插法线进行着色。但是,如果放大,则会看到整个渲染工件都存在:
我的问题是,在模型上造成这些“点”的原因是什么?我知道它必须与交叉测试有关,因为这是与另一个交叉例程渲染的相同模型:
如果缩放,您可以看到它具有相同类型的渲染错误,但它们要少得多。很难调试这个问题,因为它只能在高分辨率和高三角计数网格上显示,需要永远渲染。这是光线追踪的某种“已知问题”吗?如果是这样,可以做些什么呢?
修改:出现我的问题与精确相关。我有一个由以下原点和方向定义的光线:
o = {11.998573303222656250000, 14.635927200317382812500, 9.681089401245117187500}
d = {-0.843012511730194091797, -0.274484694004058837891, -0.462588489055633544922}
它不与由以下三个顶点定义的三角形相交:
v0 = {-0.078872203826904296875, 10.742719650268554687500, 3.051664113998413085938}
v1 = {-0.071703910827636718750, 10.628479957580566406250, 3.061952114105224609375}
v2 = {-0.005743980407714843750, 10.743999481201171875000, 3.017672061920166015625}
我的交叉测试正确实现,这意味着非命中必须是由于32位浮点数缺乏精度。那么问题就变成了可以做些什么呢?