C#光线追踪代码中vec3_extract方法触发IndexOutOfRangeException异常求助
C#光线追踪代码中vec3_extract方法触发IndexOutOfRangeException异常求助
嘿,我仔细看了你的代码,很快就定位到触发IndexOutOfRangeException的根源了,咱们来一步步拆解问题:
核心问题:布尔数组长度不匹配
你的vec3_extract方法设计是接收一个长度为3的bool数组,用来决定是否提取三维向量的对应维度(比如cond[0]对应x分量、cond[1]对应y分量、cond[2]对应z分量),但在raytrace方法里,你创建的hit数组却只有1个元素:
bool[] hit = new bool[] { d != FARAWAY && d == nearest };
当你调用vec3_extract(D, hit)时,方法里会尝试访问cond[1]和cond[2],而hit数组的索引最大只有0,这直接就导致了数组越界异常。
而且更关键的是,你这里的hit本意是标记当前场景物体是否是最近的击中目标,这是一个单个的布尔判断,完全不需要做成数组——你误用了vec3_extract/vec3_place的设计用途,这两个方法是用来筛选向量的维度,不是用来标记物体是否被击中的。
修复方案
我们直接把hit改成单个布尔变量,然后调整后续的逻辑即可:
修改raytrace方法中的循环部分:
for (int i = 0; i < scene.Length; i++) { double[] s = scene[i]; double d = distances[i]; // 把hit改成单个bool变量,表达"是否击中当前物体且是最近的" bool hit = d != FARAWAY && d == nearest; if (hit) { // 不需要用vec3_extract,直接用原始的O和D向量计算即可 double[] cc = s_light(O, D, d, scene, bounce, s); // 直接累加颜色,不需要vec3_place(它是用来处理维度扩展的,这里完全不需要) color = vec3_add(color, cc); } }
额外说明
你原来的代码里用vec3_place(cc, hit)[0]来获取颜色,这完全是错误的用法——vec3_place的作用是把一个三维向量根据布尔数组扩展成多个维度的数组,和你当前的击中判断逻辑完全不搭边。直接累加s_light返回的颜色数组就符合光线追踪的颜色叠加逻辑。
修改完之后,你可以运行代码测试一下,IndexOutOfRangeException应该会消失,同时光线追踪的渲染逻辑也能正常工作。
备注:内容来源于stack exchange,提问作者FrostDream
相关产品推荐
相关产品推荐

