我的问题是,所有Tesellation Control Shader Invocation都会产生相同的结果,为什么OPENGL必须为每个补丁多次调用此着色器。
例如:我的Tesellation控制着色器计算Bezier曲面的控制点。它需要三个顶点的数组,这些顶点是较早从“顶点着色器”中聚合的。
// 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?
最佳答案
好吧,控制着色器调用不会产生完全相同的结果,因为每个控制点的输出明显不同。但是,那简直是书呆子。
是的,在您的程序中以及到目前为止的所有程序中,是的,控制着色器对每个控制点都执行完全相同的操作,并且镶嵌级别不变。
但是,假设您使着色器为每个控制点,纹理法线或其他东西生成新属性?然后,着色器将为每个生成不同的结果。如果需要的话,具有额外的灵活性也很好。
现代GPU尝试尽可能多地并行执行。较旧的几何着色器只有一个调用,可以生成多个输出。在现代GPU上进行多次调用,每个调用都生成一个输出,效率更高,而不是更低。
关于c++ - 为什么 segmentation 化控件着色器被多次调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20590381/