select 立方体贴图正确面的快速方法?
Fast way to select the correct face of a cubemap?
给定以原点为中心的轴对齐立方体贴图和 3D 中的任意点 space,检查该点位于哪个面的直接方法包括抓取具有最大幅度的坐标并选择与该组件对应的面。
原始代码如下所示:
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
最多需要两个compares/branches来决定答案。
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; }
}
给定以原点为中心的轴对齐立方体贴图和 3D 中的任意点 space,检查该点位于哪个面的直接方法包括抓取具有最大幅度的坐标并选择与该组件对应的面。
原始代码如下所示:
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
最多需要两个compares/branches来决定答案。
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; }
}