0

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

4

1 回答 1

1

好吧,控制着色器调用不会产生完全相同的结果,因为每个控制点的输出明显不同。但这太迂腐了。

在您的程序中,以及到目前为止我的所有程序中,是的,控制着色器对每个控制点都在做完全相同的事情,并且曲面细分级别不会改变。

但是假设您有着色器为每个控制点生成新属性、纹理法线或其他什么?然后着色器将为每个生成不同的结果。如果您需要,拥有额外的灵活性是很好的。

现代 GPU 尝试尽可能多地并行执行。较旧的几何着色器具有一次调用生成多个输出。在现代 GPU 上,多次调用每个生成一个输出会更有效,而不是更少。

于 2013-12-17T00:05:19.697 回答