2013-12-22 48 views
2

我使用頂點和片段着色器對繪製圓柱體仿冒者進行分子可視化。着色器在屏幕上呈現訂單500.000個圓柱體(債券)。顯然,着色器優化是一個問題。GLSL:確定向量是否爲零

對於每個渲染柱面,我必須確定某個vec3,比如說u是不是零向量。我可能會這樣做:

dot(u,u) != 0.0 

(u.x != 0.0) || (u.y != 0.0) || (u.z != 0.0) 

any(notEqual(u, vec3(0.0, 0.0, 0.0))) 

這樣做的最快方法是什麼?以上的替代解決方案是值得歡迎的。

最好的問候,

的Mads

+0

您是否只關心矢量對於所有組件都不是*** *** * 0.0 *的情況?由於這是浮點運算,因此在很多情況下,如果使用筆和紙進行數學運算,它將完全以** 0.0 **的形式出現,但在着色器中完成時可能爲** +/- 0.0000 ...... 1 **實際上,只有當您想要針對某個特定值測試浮點數時,您才明確地將其設置爲某個值,或者知道數學不會因精度錯誤而受到影響。 –

+0

當我顯示圓柱體時,需要將它旋轉到位,即沿着它的軸線對齊。爲此,我計算u = cross(v,z),其中v是圓柱軸,z是z軸,軸。如果u!= 0,它應該被歸一化,即u = normalize(u)。如果圓柱體(鍵)沿z軸對齊,則u = 0的情況很容易發生。所以我需要檢查u!= 0,並且希望儘可能高效地做到這一點。 – repoman

回答

1

由於精度確實是浮點計算的問題,應該考慮到,真的。

#define PRECISION 0.000001 

float val = ...; 
// returns 1.0 if it's in the range, 0.0 otherwise 
float is_not_too_close_to_zero = step(-PRECISION, val) * (1.0 - step(PRECISION, val)); 

然後可以組合這種技術來產生更復雜的檢查。