我的问题是,所有的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?