我投射光线的方法是否有效?有没有更好的办法?

Is my method of casting rays efficiant? Is there a better way?

所以,我一直在深入研究光线追踪,发现我的投射光线解决方案效率很低。

for(int y = 0; y < screenHeight; y++) {
    for(int x = 0; x < screenWidth; x++) {
        vec3 ray((x * (2 / screenWidth)) - 1, (y * (2 / screenHeight)) - 1, 0);
        window.setPixel(x, y, RGB(1, 1, 1));
        for(int i = 0; i < castDistance; i++) {
            ray.z += 1; //ray position goes in diagnol line(Forwards-left)
            ray.x -= 1;

            if(ray.x >= quad.x && ray.x <= quad.x + quad.size.x &&
            ray.y >= quad.y && ray.y <= quad.y + quad.size.y &&
            ray.z >= quad.z && ray.z <= quad.z + quad.size.z) {
                window.setPixel(x, y, RGB(1, 0, 0));
            }
        }
    }
}

有没有更好的方法让我做这样的手术?

有几件事需要考虑:

  • 首先并不是所有的光线都是平行于z轴发出的,同时做ray 铸件。相反,你从一个起点(眼睛)通过你的 虚拟屏幕.

  • 其次,交叉点的检查不是通过追踪光线来完成的 一步一步,但通过检查与您
    的对象的碰撞 场景。在你的情况下,这将是一个单轴对齐的盒子,它 很容易计算出一条射线与一条轴线的交点对齐
    盒子。例如这里描述:
    https://tavianator.com/fast-branchless-raybounding-box-intersections/