我的問題是,所有的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?