目录

  • 什么是面片
  • 细分控制
    • 内侧细分层级
    • 外侧细分层级
  • 细分计算
    • 设置图元生成域
    • 设置生成图元的面朝向
    • 设置细分坐标的间隔
    • 输出点集
    • 例子
    • gl_in的结构体
  • 函数
    • (设置面片顶点数)glPatchParameteri(GLenum paname,GLint value)
    • (设置内测和外侧细分层级因数)glPatchParameterfv(GLenum panme, const GLfloat* values)
  • 内置变量
    • (获取gl_in的元素个数)gl_PatchVerticesIn
    • (当前细分着色器在控制的顶点索引)gl_InvocationID
    • (gl_in的大小 输入面片的顶点数量)gl_PatchVerticesIn
    • (gl_out的大小 输出面片的顶点数量)gl_PatchVerticesOut
    • (细分坐标)gl_TessCoord(不知道干嘛的)
    • (细分控制着色器的输出顶点)gl_out[i].gl_Position
  • 例子

什么是面片

是一个传递给OpenGL的顶点列表
使用面片绘制的区别:
如果我们不使用面片绘制图形 我们就是使用默认的图元类型 这些类型都是已知图元类型和顶点数量的对应关系 例如三个顶点对应于一个三角形 或者两个顶点对应于一条线
但是如果使用面片 我们无法知道一个面片包含了多少个顶点 所以就要使用glPatchParameteri()

细分控制

细分控制着色器负责控制要渲染的输出面片类型 也就是细分发生的区域
OpenGL有三种细分域:四边形 三角形 等值线集合

内侧细分层级

设置的是细分区域的内部划分方式 保存在gl_TessLevelInner中
内测细分层级的值设置了区域内水平和垂直方向上各自有多少“区域”

外侧细分层级

负责控制细分区域的周长 保存在gl_TessLevelOuter数组中
外侧细分层级的值于周长上每条边的段数是对应的

细分计算

每个通过图元生成的细分坐标都需要执行一次细分计算着色器
细分计算着色器的输入变量

变量声明 描述
gl_PrimitiveID 当前输入面片的图元索引
gl_PatchVerticesIn 输入面片的顶点数,也就是gl_in的大小
gl_TessLevelOuter[4] 外侧细分层级的值
gl_TessLevelInner[2] 内测细分层级的值
gl_TessCoord 细分坐标 还未进入细分计算着色器中面片域空间的顶点坐标值

细分计算着色器中输出的顶点数据被存储在如下的接口块中

out gl_PerVertex
{vec4 gl_Positionl;float gl_PointSize;float gl_ClipDistance[];float gl_CullDistance[];
}

设置图元生成域

图元类型 描述 域坐标
quads 单位块上的一个四边形域 (u,v)对的形式 u,v范围0-1
triangles 使用重心坐标的三角形 (a,b,c)坐标形式,范围均为0-1 且a+b+c = 1
isolines 一系列穿过单位块的线段集合 (u,v)对的形式 u的范围0-1,v的范围0到接近1

设置生成图元的面朝向

cw表示顶点按照顺时针排列 ccw相反

设置细分坐标的间隔

选项
equal_spacing 细分层将被截断在[1,max]范围内 然后取整到下一个整数值
frational_even_spacing 数值将被截断在[2,max] 范围内 然后取整到下一个偶数整数值n 然后将边界划分为n-2个等长的部分 以及2个位于两端的部分
fractional_odd_spacing 数值将被截断在[1,max] 范围内 然后取整到下一个奇数整数值n 然后将边界划分为n-2个等长的部分 以及2个位于两端的部分

max表示OpenGL中能支持的最大细层级值

输出点集

如果想输出点集而不是等值线或者填充区域 我们可用使用point_mode选项 他会为细分计算着色器处理的每个顶点渲染一个单独的点

例子


gl_TessLevelOuter[0] =2.0;
gl_TessLevelOuter[1] =3.0;
gl_TessLevelOuter[2] =2.0;
gl_TessLevelOuter[3] =5.0;
gl_TessLevelInner[0] =3.0;
gl_TessLevelInner[0] =4.0;
上图是对区域三角化的结果


gl_TessLevelOuter[0] =6.0;
gl_TessLevelOuter[1] =8.0;
最上面有一条虚线是因为等值线的结果并不包含边长上的等值数据
如果两个面片共享一条边 则边长上不会发生交叠情况


gl_TessLevelOuter[0] =6.0;
gl_TessLevelOuter[1] =5.0;
gl_TessLevelOuter[2] =8.0;
gl_TessLevelInner[0] =5.0;
如果用t表示内侧细分层级 则偶数在中心点和周长之间生成(t/2)-1个同心三角形
奇数则到周长为止生成 (t/2)-1个同心三角形

左边为gl_TessLevelInner[0] = 奇数时 右边为gl_TessLevelInner[0] = 偶数时

细分着色器有两个着色阶段 细分控制着色器,细分计算着色器
1.首先要指定面片 也就是顶点的有序列表
2.渲染面片时 将首先执行细分控制着色器,处理面片顶点,并设置面片中要生成多少集合数据
3.细分控制着色器结束后 细分计算着色器将负责把生成网格的顶点放置到细分坐标指定的位置 并将他们发送到光栅化阶段 或发给几何着色器

所有管线中的着色器都能处理片元这个图元类型

gl_in的结构体

in gl_PerVertex
{vec4 gl_Positionl;float gl_PointSize;float gl_ClipDistance[];float gl_CullDistance[];
}gl_in[gl_PatchVerticesIn];

函数

(设置面片顶点数)glPatchParameteri(GLenum paname,GLint value)

设置一个面片中的顶点数为vlaue panme必须设置为GL_PATCH_VERTICES
一个面片默认值是3 如果面片的顶点数量小于这个值 那么将忽略这个面片 不会产生几何体

(设置内测和外侧细分层级因数)glPatchParameterfv(GLenum panme, const GLfloat* values)

如果没有绑定细分控制着色器 则用这个函数来设置内测和外侧细分层级因数
pname必须时GL_PATCH_DEFAULT_OUTER_LEVEL或者GL_PATCH_DEPCH_INNER_LEVEL

内置变量

(获取gl_in的元素个数)gl_PatchVerticesIn

(当前细分着色器在控制的顶点索引)gl_InvocationID

(gl_in的大小 输入面片的顶点数量)gl_PatchVerticesIn

(gl_out的大小 输出面片的顶点数量)gl_PatchVerticesOut

(细分坐标)gl_TessCoord(不知道干嘛的)

(细分控制着色器的输出顶点)gl_out[i].gl_Position

这是细分计算着色器中调用gl_out[i].gl_Position可以获取从细分控制着色器输进来的顶点坐标

例子

#version 430 core
layout (vertices = 4) out;
void main()
{gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

OpenGL3.3-细分着色器相关推荐

  1. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  2. 曲面细分着色器---细分二维四边形

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.曲面细分 二.细分二维四边形 参考 前言 术语Tessellation(镶嵌)是指一大类设计活动,通常是指在平坦的表面上,用各种 ...

  3. 曲面细分着色器与几何着色器

    着色器执行顺序 顶点着色器->曲面细分着色器->几何着色器->片元着色器 曲面细分着色器细分后的顶点属于重心空间. 曲面细分着色器 应用:海浪.雪地等 与置换贴图结合:只使用法线贴图 ...

  4. UnityShader 曲面细分着色器 生成地形 高度贴图

    什么是曲面细分着色器 如下图 ​ 曲面细分着色器比较官方定义:可以将一个几何体细化为一个球体也能将一根直线无限向曲线逼近 曲面细分着色器将复杂的曲面转换为简单的点,线,三角形等.它分为三部分:曲面细分 ...

  5. 曲面细分(subdivision)曲面细分着色器GPU的LOD

    曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果 曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术) .这一过程是可以在 ...

  6. unity曲面细分着色器详解

     前言:本文翻译自catlikecoding上一篇十分详细的英文blog并修改了几处错误,逐行解释了如何在自己的shader中添加曲面细分支持,并给出了多种计算细分因子的方案以及它们的优缺点. 原文链 ...

  7. Shader学习_曲面细分着色器

    曲面细分 详细介绍 当然除了细分与简化之外,还有另外一种同属一类的操作叫做==曲面规则化(Mesh Regularization)==其所作的便是将三角面都变的尽可能相同,从而也达到提升模型效果的目的 ...

  8. DirectX 12 曲面细分着色器笔记

    曲面细分着色器 1. 背景 2. 曲面细分工作机制 2.1 Hull Shader(外壳着色器) 2.2 Tessellator(曲面细分器) 2.3 Domain Shader(域细分器) 3. 编 ...

  9. 曲面细分着色器学习记录

    曲面细分着色器学习记录 前言: 今天终于走通了Catlike大佬的曲面细分着色器教程,感慨一番,自己的学习之路还很漫长呢 今天的博客内容只是简单的记录一下Catlike大佬的教程 先上个链接:Catl ...

最新文章

  1. 大幅涨点!孙剑团队提出新激活层ACON和轻量级网络TFNet
  2. 基于Xcode安装CocoaPods报错
  3. Spring-Spring 开发环境搭建及HelloSpring
  4. pip升级之后出现no module named pip
  5. 抽象类和接口的共同点和区别
  6. 基于哈希表的索引堆变形(Hackerrank: QHEAP1)
  7. 117. Populating Next Right Pointers in Each Node II 计算右边的附属节点
  8. slam 无人车 融合imu 后手动调整小车位姿,不受里程计影响
  9. CCF201803-5 二次求和(100分题解链接)
  10. 给VS2008中c#代码自动添加版权信息
  11. Enterprise Library 5.0 中的Validators
  12. anaconda r 语言_anaconda 配置R语言
  13. ORACLE数据库无法执行UPDATE
  14. 北漂三年多 我选择离开,眼神更加坚定!
  15. ad敷铜后还有部分飞线_PCB Layout软件分析对比(AD、Pads、Allegro)
  16. 高校或企业开源软件镜像站【汇总】2022.5.8
  17. iOS安全–看了这个,你还敢用分身版微信吗?
  18. 液晶屏背光源该如何检测?
  19. WPF仿Win7便笺
  20. 甲方IT人员管理办法实践

热门文章

  1. 服务器软件配置文件,服务器多开软件配置文件
  2. 服务器多如何开虚拟机,服务器可以多开虚拟机
  3. LRM-00109问题的处理,生成pfile文件启动数据库
  4. linux无损转换磁盘成gpt分区,Linux下数据无损动态修改MBR分区表格式为GPT
  5. 华为NE40策略路由配置
  6. 德勤consulting oracle,【德勤 SAP - Technology - Consulting】-Utips校招-你的名企情报站
  7. 涿州不低调 再创环京价值至高点
  8. c 访问java webservice_java调用webservice .
  9. 蓝鸟计算机专业学校,蓝鸟中文编程软件
  10. 中小企业外贸erp软件有什么特点?