曲面细分着色器(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

细分shader和几何shader是计算机图形学中的两种重要的着色器类型。 细分shaderTessellation Shader)是一种用于进行细分操作的着色器。它可以将输入的三角形网格进行细分,并生成更高分辨率的三角形网格。细分shader通常用于提高曲面细节的展示效果。通过在输入的三角形上插入新的顶点,并对这些顶点进行位置调整,细分着色器可以产生更加平滑的曲面细节,并增加模型的细节级别。细分shader常用于模型细分细节的增强,如地形细分、角色细分曲面细分等。 几何shader(Geometry Shader)是在细分shader之后执行的着色器细分shader生成的细分网格会进一步传递给几何shader。几何shader可以对输入的三角形网格进行操作,包括增加、删除和改变顶点的属性。通过几何shader,我们可以对模型进行各种形状的变换和处理,如通过给三角形添加顶点产生更多的几何图元,或者通过删除顶点合并多个三角形。几何shader在进一步处理模型形状、拆分或合并模型几何体、调整三角形顶点属性等方面具有极大的灵活性。它可以在多个输入图元之间进行交互,并能够生成不同类型的图元作为输出。 综上所述,细分shader和几何shader是在计算机图形学中常用的两种着色器类型。细分shader用于增加模型的细节级别,而几何shader用于对模型的形状进行操作和变换。它们在计算机图形学中扮演着重要的角色,为实时渲染和图形处理提供了更大的灵活性和细节控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值