我投射光线的方法是否有效?有没有更好的办法?
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/
所以,我一直在深入研究光线追踪,发现我的投射光线解决方案效率很低。
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/