我的问题是所有的 Tesellation Control Shader Invocation 都会产生相同的结果,为什么 OPENGL 必须为每个补丁多次调用这个着色器。例如:My Tesellation Control Shader 计算 Bezier 曲面的控制点。它需要一个包含三个顶点的数组,这些顶点是之前从 Vertex Shaders 聚合的。
// attributes of the input CPs
in vec3 WorldPos_CS_in[];
我的补丁大小是 3,因此对于相同的输入调用 Tesellation Control Shader 3 次,保存为 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 将此补丁划分为镶嵌坐标的相同信息:
// Calculate the tessellation levels
gl_TessLevelOuter[0] = gTessellationLevel;
gl_TessLevelOuter[1] = gTessellationLevel;
gl_TessLevelOuter[2] = gTessellationLevel;
gl_TessLevelInner[0] = gTessellationLevel;
很明显,所有的 Tes Control Shader 都做同样的工作。会不会浪费资源?为什么每个补丁都应该调用一次 Tesellation Control Shader?