为什么要多次调用Tessellation控件着色器?

时间:2013-12-15 01:51:25

标签: c++ opengl shader vertex-shader tessellation

我的问题是,所有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着色器一次?

1 个答案:

答案 0 :(得分:1)

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

在你的程序中,到目前为止,在我的所有程序中,是的,控件着色器对每个控制点执行完全相同的操作,并且曲面细分级别不会改变。

但是假设你有着色器为每个控制点生成新属性,纹理正常还是什么?然后着色器会为每个生成不同的结果。如果您需要,可以获得额外的灵活性。

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