2013-05-27 104 views
1

是否與某種對GLSL布爾檢查只執行一次函數的方法嗎?或者我錯過了一些重要的東西?下面的代碼似乎沒有幫助。執行一個GLSL函數只有一次

bool once = false; 

DoOnce() 
{ 
    for (int i = 0; i < someConst; i++) 
    { 
     //do some things... 
    } 
    once = true; 
} 

void main() 
{ 
    if (!once) 
    { 
     DoOnce(); 
    } 
    //do other things   
} 

或者我是否必須爲這種行爲使用計算着色器?

+1

你說的「只有一次」是什麼意思? *將*只執行一次。每次調用着色器。你是否試圖做一些着色器調用互相交談的事情? –

+0

如果你有原子OPS,你可以把它只執行一次(總,不是每個調用),但它是不可能的,你真的* *要做到這一點。對於只執行一次的東西,在CPU上執行它可能更有效。使用GLSL的重點是大規模平行運行多次。 – Damon

回答

1

它看起來像你想生成一些數據,可在以後通過着色器調用的使用,以及如何做到這一點,這不是。 @Nicol當然是對的,並且該函數將被稱爲per-invocation,這對於頂點着色器的每個頂點將是一次,依此類推。理論上你可以使用Transform Feedback buffer來存儲done值,但這絕對不是一個好的解決方案。

如果你想寫GLSL代碼生成這樣的高速緩存,該代碼分爲兩個部分分開:緩存生成和緩存的使用。首先,運行高速緩存代入一些緩衝器(它們的類型取決於哪些數據正在生成,它們可以是紋理,維也納組織或不同的東西),然後結合並在實際的繪製代碼中使用這些緩衝區。

如果您指定了緩存內容,我可能能夠幫助您更多地瞭解設置,但是因爲它的變化非常大(紋理/ VBO構造,然後通過任一頂點屬性進行綁定,可能使用實例除數或相應的採樣器紋理),現在只會是一個盲目的猜測。

+0

謝謝,看起來我必須改變我的方法。 – tayrak