2013-12-15 54 views
0

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

回答

1

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

在您的程序中,以及迄今为止的所有内容中,控制着色器对每个控制点都执行完全相同的操作,并且曲面细分级别不会改变。

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

现代GPU试图尽可能地并行。较早的几何着色器有一个调用产生多个输出。现代GPU具有多个调用,每个产生一个输出效率更高,而不是更低。

相关问题