曲面细分着色器(Tessellation)

2023-11-06

    图形渲染流水线如下:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

曲面细分着色器(Tessellation) 的相关文章

随机推荐

  • 7-7 12-24小时制 (15 分) (C语言实现)

    题目 思路 直接跟着题目往下写 没有过多思考 后面答案部分正确 才重新写了12点那里的程序 11min 代码 include
  • Java连接mysql数据库和oracle连接数据库驱动对比

    oracle安装复杂 占用空间大 很多人用了oracle之后就不用了 项目需要复现 如何实现 那就使用mysql数据库 mysql数据库安装和一般软件安装毫无区别 另外公司中最常用数据库文件就是保存整个的数据库的文件 这样可以进行不断的维护
  • 【环境配置】Windows10终端和VSCode下能够直接打开Anaconda-Prompt

    很多小伙伴在 Windows 下做深度学习开发的时候 遇到终端没有在 Linux 那么方便 那么我们现在就可以来设置一下 这样我们也可以在文件夹内部右键打开终端 也可以在 VS Code 里面新建一个虚拟环境的控制台 这里主要是针对 Ana
  • 嵌入式Linux入门指南(一)——学习路线篇

    嵌入式Linux入门指南 一 学习路线篇 摘要 文章介绍在Linux入门过程中的学习路线 必看书籍分享 1 开始学习实践Linux之前先清楚如何学习很重要 虽然条条大路通罗马 殊途同归 但是不同的路线要付出的代价 时间成本 显然差别巨大 总
  • C#GDI+编程基础(一:Graphics画布类)

    GDI 存在的意义 将变成与具体硬件实现细节分开 GDI 步骤 获取画布 绘制图像 处理图像 命名空间 using System Drawing 提供对GDI 基本图形功能的访问 using System Drawing Drawing2D
  • 5. Java数据类型

    数据类型 基本类型 整数类型 byte short int long 浮点类型 float double 字符类型 char String 布尔类型 true false public class demo2 public static v
  • 第十三届蓝桥杯Python 大学B组真题详解

    第十三届蓝桥杯Python B组真题详解 试题A 排列字母 试题B 寻找整数 试题C 纸张尺寸 试题D 位数排序 试题E 蜂巢 试题F 消除游戏 试题G 全排列的价值 试题H 技能升级 试题I 最长不下降子序列 最优清零方案 本届比赛 两道
  • 性能测试调优模型、思想和技术

    最近阅读 软件性能测试 分析与调优实践之路 一书 个人认为性能调优章节为整部书的精华 该章节包括了性能测试调优模型 调优思想和调优技术 下面是摘抄整理自书中内容 调优模型 下图为互联网中常见的用户请求的分层转发和处理的过程 在性能调优时就是
  • 5.5 综合案例1.0-电力采集

    综合案例 电力采集 1 简介 1 1 BL0939芯片 1 2 语音合成 1 3 注意事项 2 阿里云端设置 3 测试代码 main py app relay py app led py app elec py app audio py a
  • MySQL表的约束

    目录 约束 概念 分类 非空约束 not null 唯一约束 unique 主键约束 primary key 外键约束 foreign key 继续使用上篇文章https blog csdn net z714405489 article d
  • 94-----JS基础-----dom查询

    一 代码 同样很简单 但是下面的接口会比较常用 用到时具体看一下即可 主要是三个接口 1 document getElementById 2 document getElementsByTagName 3 document getEleme
  • (附源码)springboot学生宿舍管理系统 毕业设计 211955

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • Loguru 源码中如何sink参数是日志路径时,rotation不能精确到天

    当我们把日志一直不停写入某个文件中 那么这个文件可能会有几十上百 GB 显然这样是没有办法查看和检索的 所以我们需要一些方式来切分日志 例如 每个日志文件只有1GB 超过1GB 后 自动生成新的日志 又或者每天0点自动生成新的日志 当日志按
  • ROS与Arduino:Arduino IDE的配置安装+实现简单串口通讯

    rosserial arduino包可让ROS和ArduinoIDE一起工作 rosserial提供的ROS通讯协议工作在Arduino的UART上 它让Arduino成为标准的ROS节点 可以发布和订阅ROS消息 发布TF转换 获取ROS
  • WIN 10找不到IE浏览器&打不开IE浏览器&用户名自带“域”,怎么办?

    前言 因客户侧系统依赖安装VPN才能访问 客户发的证书安装文档 又依赖IE浏览器下进行 也试过其他浏览器总是卡在提交证书申请前的信息加载 所以开始找本机的IE浏览器 然而遇到的情况是这样的 1 总是跳转到Microsoft Edge 在这个
  • nuxt打包路劲问题_Nuxt最简入门,让vue项目快速被搜索引擎收录

    Nuxt js是vue js的通用框架 最常用的就是作ssr 一般的vue cli不利于搜索引擎的seo操作 但是nuxt很好的解决了这一大问题 Nuxt的优点 基于 Vue js 自动代码分层 服务端渲染 强大的路由功能 支持异步数据 静
  • Stream按对象某属性去重的方案

    1 Collectors collectingAndThen 这是Stream中的一个收集器 相比普通的Collectors toList Collectors groupingBy等收集器 Collectors collectingAnd
  • 从外部访问本机vmware虚拟机的方法

    转载 https www csdn net tags MtTaEgzsMzI0NTYwLWJsb2cO0O0O html 从外部访问本机vmware虚拟机的方法 2021 10 19 11 39 23 环境情况 本地 操作系统为window
  • Windows 11配置WSL及Linux子系统安装

    说明 在Windows系统中 一般使用Linux子系统是通过安装虚拟机的方法 再使用虚拟机安装Linux子系统 常用的虚拟机软件有VMware Workstation等 但是该软件是收费软件 在企业开发时需要支付授权费用 Windows 1
  • 曲面细分着色器(Tessellation)

    图形渲染流水线如下 1 顶点着色器 version 410 core void main void const vec4 vertices vec4 vec4 0 25