给定一个以原点为中心的轴对齐立方体贴图和 3D 空间中的任意点,检查该点所在的面的直接方法是抓取具有最大量级的坐标并选择与该分量对应的面。
朴素的代码如下:
if (fabs(point.x) >= fabs(point.y) && fabs(point.x) >= fabs(point.z)) {
if (point.x >= 0) {face=0;} else {face=1;}
}
if (fabs(point.y) >= fabs(point.x) && fabs(point.y) >= fabs(point.z)) {
if (point.y >= 0) {face=2;} else {face=3;}
}
if (fabs(point.z) >= fabs(point.x) && fabs(point.z) >= fabs(point.y)) {
if (point.z >= 0) {face=4;} else {face=5;}
}
有没有办法实现在 C 中被认为更好的相同事情?
无分支代码会更优化吗?
任何选择的在线装配标准都可以用于此目的。
如有必要,可以将所有>=
运算符转换为>
运算符。
可能看起来不多,但前三个 if
语句消除了对 fabs
的所有调用,并替换了已发布代码中的内部 if
语句。最终if/else
最多需要两个比较/分支来确定答案。
if ( point.x < 0 ) {
x = -point.x;
fx = 1;
} else {
x = point.x;
fx = 0;
}
if ( point.y < 0 ) {
y = -point.y;
fy = 3;
} else {
y = point.y;
fy = 2;
}
if ( point.z < 0 ) {
z = -point.z;
fz = 5;
} else {
z = point.z;
fz = 4;
}
if ( x >= y ) {
if ( x >= z ) { face = fx; } else { face = fz; }
} else {
if ( y >= z ) { face = fy; } else { face = fz; }
}