You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:14:30