我有這個SphereInFrustrum功能在這裏:優化SphereInFrustrum檢查
0.49% int FrustumG::sphereInFrustum(Vec3 &p, float radius) {
int result = INSIDE;
float distance;
2.40% for(int i=0; i < 6; i++) {
7.94% distance = pl[i].distance(p);
12.21% if (distance < -radius)
0.67% return OUTSIDE;
3.67% else if (distance < radius)
result = INTERSECT;
}
return(result);
}
的數字是從我的代碼分析器。問題是,這個檢查比實際渲染花費的時間更長。實施幾何撲殺的關鍵在於我可以擁有非常高的水平。我真的只需要一種非常快速和骯髒的方式來查看AABB是否進入或退出。現在我給它提供立方體的半徑和中心。鑑於我的箱子是AABB,有沒有更快的方法來做到這一點?我贊成速度超過準確性。
感謝
如果我提供的多維數據集的最小值和最大值將使得它更快?我敢肯定,如果沒有使用平方根的距離公式,一定有辦法做到這一點;
float Plane::distance(Vec3 &p) {
return (d + normal.innerProduct(p));
}
float Vec3::innerProduct(Vec3 &v) {
return (x * v.x + y * v.y + z * v.z);
}
它看起來像你在使用這裏給出的截頭扭曲:http://www.lighthouse3d.com/opengl/viewfrustum/index.php?gimp。是對的嗎? – 2010-09-07 22:23:12
很難相信簡單的float比較真的佔用了12.21%的執行時間。如果是這樣,那麼你的距離函數必須*該死*快(如在負時鐘週期快)。也許profiler將距離函數的執行部分歸因於這裏的'if'測試。你可以發佈'距離'的代碼嗎?我想那裏會有更多的優化機會。 – 2010-09-07 22:25:41
是的,這是正確的,它的效果很好,但是當我得到大量的物體時,檢查超過了渲染時間 – jmasterx 2010-09-07 22:26:29