【发布时间】:2022-01-20 18:49:41
【问题描述】:
“我的光线追踪器”最关键的部分之一是计算光线盒之间的碰撞,这是通过以下方式完成的:
inline bool hitsCube(in Ray ray, in Cube cube,
out float tMin, out float tMax,
out float3 signMin, out float3 signMax)
{
float3 biggerThan0 = ray.odir > 0; // ray.odir = (1.0/ray.dir)
float3 lessThan0 = 1.0f - biggerThan0;
float3 tMinXYZ = cube.center + biggerThan0 * cube.minSize + lessThan0 * cube.maxSize;
float3 tMaxXZY = cube.center + biggerThan0 * cube.maxSize + lessThan0 * cube.minSize;
float3 rMinXYZ = (tMinXYZ - ray.origin) * ray.odir;
float3 rMaxXYZ = (tMaxXZY - ray.origin) * ray.odir;
float minV = max(rMinXYZ.x, max(rMinXYZ.y, rMinXYZ.z));
float maxV = min(rMaxXYZ.x, min(rMaxXYZ.y, rMaxXYZ.z));
tMin = minV;
tMax = maxV;
signMin = (rMinXYZ == minV) * lessThan0; // important calculation for another algorithm, but no context provided here
signMax = (rMaxXYZ == maxV) * lessThan0;
return maxV > minV * (minV + maxV >= 0); // last multiplication makes sure the origin of the ray is outside the cube
}
这个函数在 hlsl-shader 中被调用了很多次(对于某些像素至少 200/300 次),但在某些点上会出现延迟。我的碰撞逻辑实现效率低吗? '我尽量避免分支,因此,作为回报有更多的乘法。这有多低效?
【问题讨论】:
-
您是否已将碰撞框排序为树形结构?如果您使用 Nvidia 和较新的显卡,还有用于专用碰撞检测的光线跟踪单元。
标签: algorithm hlsl bounding-box raytracing ray