2013-12-15 85 views
0

我的問題是,所有的Tesellation Control Shader Invocation都會產生相同的結果,爲什麼OPENGL必須爲每個補丁多次調用該着色器。 例如:我的Tesellation Control Shader計算Bezier曲面的控制點。它需要一個三個頂點的數組,這些頂點來自頂點着色器之前的聚合。爲什麼賽格控制着色器被調用多次?

// attributes of the input CPs 
in vec3 WorldPos_CS_in[]; 

我的補丁大小爲3,那麼Tesellation控制着色器被調用相同的輸入三次,節省gl_invocatinoID,然後所有的人都產生相同的以下控制點:

struct OutputPatch                    
{                         
vec3 WorldPos_B030;                   
vec3 WorldPos_B021;                   
vec3 WorldPos_B012;                   
vec3 WorldPos_B003;                   
vec3 WorldPos_B102;                   
vec3 WorldPos_B201;                   
vec3 WorldPos_B300;                   
vec3 WorldPos_B210;                   
vec3 WorldPos_B120;                   
vec3 WorldPos_B111;                   
vec3 Normal[3];                    
vec2 TexCoord[3];                    
};                        

// attributes of the output CPs                 
out patch OutputPatch oPatch; 

而且,也有助於OpenGL的劃分這個補丁到tesellation相同的信息座標:

// Calculate the tessellation levels  
gl_TessLevelOuter[0] = gTessellationLevel; 
gl_TessLevelOuter[1] = gTessellationLevel; 
gl_TessLevelOuter[2] = gTessellationLevel; 
gl_TessLevelInner[0] = gTessellationLevel; 

很顯然,所有的維護設備控制着色器做同樣的工作。它浪費資源嗎?爲什麼應該爲每個補丁程序調用一次Tesellation Control Shader?

回答

1

那麼控制着色器調用不會產生完全相同的結果,因爲每個控制點輸出明顯不同。但那是迂腐。

在您的程序中,以及迄今爲止的所有內容中,控制着色器對每個控制點都執行完全相同的操作,並且曲面細分級別不會改變。

但是,假設你有着色器爲每個控制點生成新的屬性,紋理正常或什麼?然後着色器會爲每個結果生成不同的結果。如果您需要,可以獲得額外的靈活性。

現代GPU試圖儘可能地並行。較早的幾何着色器有一個調用產生多個輸出。現代GPU具有多個調用,每個產生一個輸出效率更高,而不是更低。

相關問題