2014-03-28 15 views
2

爲了使長話短說,我是不是更好做這樣的:在GLSL中,分支還是從虛擬紋理中查找更好?

if (normalMappingEnabled) 
{ 
    normal = calculateBumpedNormalFromTexture(); 
} 
else 
{ 
    normal = somethingMuchEasierToCalculate(); 
} 

凡normalMappingEnabled是一個統一的,calculateBumpedNormalFromTexture需要一個紋理查找和所有其他數學的需要法線貼圖,並somethingMuchEasierToCalculate要求沒有質感查找,並簡單地吐出插值的每頂點法線。

或該:

normal = calculateBumpedNormalFromTexture(); 

凡在這種情況下,如果我不需要正常映射,正常的紋理是1x1的,包含該點的單個紋素直線上升,產生相同的結果,如果我剛剛使用了插值的每頂點法線。

這是哪種最先進的設備也比較快?有沒有其他的解決方案我沒有考慮過(除了使用2種不同的着色器)?

回答

2

如果所有調用片段的條件相同,則不會發生分支分歧。所以在這種情況下,AFAIK不會有性能損失。

問題是當一些線程需要執行一個分支而另一些線​​程需要執行另一個分支時。由於不同的指令不能並行執行(在一個處理器上),所以兩個分支將按順序執行(一些線程將被執行,另一個將等待,然後另一部分將被執行,第一部分將等待)。

+0

條件(normalMappingEnabled)只會在繪製調用之間發生變化 - 它是一個統一的變量。 –

+0

是的 - 正如我所說的,在這種情況下,應該沒有性能損失。 –

+0

謝謝,這是很好的知道。這也適用於switch語句和循環嗎?如何使用統一的緩衝區對象? –