所以,我一直在深入研究光线追踪的深度,并且我发现我投射光线的解决方案效率很低。
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));
}
}
}
}
我有更好的方法来做这样的手术吗?
答案 0 :(得分:0)
有几件事你想考虑:
首先不是所有的光线都是平行于z轴发送的,而是做光线 铸件。相反,你从原点(眼睛)拍摄它们 虚拟屏幕。
其次,通过跟踪光线来检查交叉点
一步一步,但检查与你的对象的碰撞
现场。在您的情况下,这将是一个单轴对齐框和它
很容易计算出光线与轴对齐的交点
框。例如,这里描述:
https://tavianator.com/fast-branchless-raybounding-box-intersections/