曲面细分着色器(Tessellation)

    图形渲染流水线如下:

1.顶点着色器

#version 410 core                                                
                                                                 
void main(void)                                                  
{                                                                
    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0), 
                                   vec4(-0.25, -0.25, 0.5, 1.0), 
                                   vec4( 0.25,  0.25, 0.5, 1.0));
                                                                 
    gl_Position = vertices[gl_VertexID];                         
}                                                                

    每个顶点上都运行一次顶点着色器。gl_Position和gl_VertexID是内部变量。gl_VertexID表示当前顶点的索引,gl_Position表示位置。

2.曲面细分着色器

    曲面细分着色器将复杂的曲面转换为简单的点,线,三角形等。它分为三部分:曲面细分控制着色器(Tessellation Control Shaders),曲面细分引擎(The Tessellation Engine),曲面细分求值着色器(Tessellation Evaluation Shaders)。

2.1 曲面细分控制着色器

     曲面细分控制着色器负责确定曲面细分等级。

#version 410 core                                                             
                                                                              
layout (vertices = 3) out;                                                    
                                                                              
void main(void)                                                               
{                                                                             
    if (gl_InvocationID == 0)                                                 
    {                                                                         
        gl_TessLevelInner[0] = 5.0;                                           
        gl_TessLevelOuter[0] = 5.0;                                           
        gl_TessLevelOuter[1] = 5.0;                                           
        gl_TessLevelOuter[2] = 5.0;                                           
    }                                                                         
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; 
}                                                                             

    layout (vertices = 3) out;表示生成的控制点的个数。gl_TessLevelInner和gl_TessLevelOuter是内部变量,分别表示内外曲面细分等级(等级越高细分越精细)。gl_in和gl_out也是内部变量,分别表示输入输出数据。gl_InvocationID表示索引。

2.2 曲面细分引擎

    曲面细分引擎是固定管线,将复杂的曲面转换为简单的点,线,三角形等。

2.3 曲面细分求值着色器

#version 410 core                                           
                                                            
layout (triangles, equal_spacing, cw) in;                   
                                                            
void main(void)                                             
{                                                           
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) + 
                  (gl_TessCoord.y * gl_in[1].gl_Position) + 
                  (gl_TessCoord.z * gl_in[2].gl_Position);  
}                                                           

    在细分后生成的顶点上都运行该着色器。所以,当曲面细分的精度越高,生成的顶点就越多,该着色器运行的次数就越多。其中设置细分模式的语句如下:

layout (triangles, equal_spacing, cw)  in 

   表示以等分边界的方式,顺时针生成三角形。

   gl_TessCoord表示生成顶点的重心。

3.片元着色器

    片元着色器负责计算片元的颜色。

#version 410 core                     
                                      
out vec4 color;                       
                                      
void main(void)                       
{                                     
    color = vec4(0.0, 0.8, 1.0, 1.0); 
}                                     

4.渲染结果

    以下是在不同的细分精度下的渲染结果:

              

gl_TessLevelInner[0] = 5.0;
gl_TessLevelOuter[0] = 5.0;
gl_TessLevelOuter[1] = 5.0;
gl_TessLevelOuter[2] = 5.0;

gl_TessLevelInner[0] = 5.0;
gl_TessLevelOuter[0] = 2.0;
gl_TessLevelOuter[1] = 2.0;
gl_TessLevelOuter[2] = 2.0;

                

gl_TessLevelInner[0] =  2.0;
gl_TessLevelOuter[0] = 5.0;
gl_TessLevelOuter[1] = 5.0;
gl_TessLevelOuter[2] = 5.0;

  

gl_TessLevelInner[0] = 2.0;
gl_TessLevelOuter[0] = 2.0;
gl_TessLevelOuter[1] = 2.0;
gl_TessLevelOuter[2] = 2.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值