我的问题是,所有Tesellation Control着色器调用都产生相同的结果,为什么OPENGL必须为每个补丁多次调用此着色器。 例如:My Tesellation Control Shader计算Bezier曲面的控制点。它采用三个顶点的数组,这些顶点先前从顶点着色器聚合。
// attributes of the input CPs
in vec3 WorldPos_CS_in[];
我的补丁大小是3,因此对于相同的输入调用Tesellation Control Shader三次,除了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将此补丁划分为tecellation坐标的信息:
// 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着色器一次?
答案 0 :(得分:1)
控件着色器调用不会产生完全相同的结果,因为每个控制点输出明显不同。但那是迂腐的。
在你的程序中,到目前为止,在我的所有程序中,是的,控件着色器对每个控制点执行完全相同的操作,并且曲面细分级别不会改变。
但是假设你有着色器为每个控制点生成新属性,纹理正常还是什么?然后着色器会为每个生成不同的结果。如果您需要,可以获得额外的灵活性。
现代GPU尝试尽可能多地并行执行。旧的几何着色器有一个调用生成多个输出。现代GPU上更高效,而不是更少,有多个调用,每个调用生成一个输出。