位置: 编程技术 - 正文

GLSL Tessellation Shader的编程入门介绍

编辑:rootadmin

推荐整理分享GLSL Tessellation Shader的编程入门介绍,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

Tessellation Shader是OpenGL4.0引入的新特性,由Tessellation Control Shader和Tessellation Evaluation Shader两部分构成,在管线中位于Vertex Shader和Geometry Shader中间。引入了这两个Shader之后的OpenGL管线如下图所示

这两个Shader正如其名,是为了做曲面细分而存在的。他们的输入叫Patch,是由多个顶点组成的一个结构;输出是图元(Primitive),也就是Geometry Shader输入输出的那个。

OpenGL中添加这两个Shader和添加其他Shader的过程类&#;,先create,链上代码,编译,最后连接到Shader程序。也就是调用glCreateShader,glShaderSource,glCompileShader,glAttachShader这几个函数。只提一下glCreateShader,建立Tessellation Control Shader用GL_TESS_CONTROL_SHADER,建立Tessellation Evaluation Shader用GL_TESS_EVALUATION_SHADER。如下:

前面提到Tessellation Shader的输入是由多个顶点组成的Patch,这个Patch的顶点数是在OpenGL中调用glPatchParameteri指定的。

pname为GL_PATCH_VERTICES,value为每个Patch的顶点数。例如当你想让每个Patch由4个点组成时调用如下: 在Tessellation Shader中每个Patch都是独立的,不存在Patch Strip之类的东西,需要与Geometry Shader中带邻接信息图元的概念区分开。如果你需要用到邻接信息,那么你只能让这个Patch包含所有你需要用到的顶点。例如你需要做一个参数曲面需要用到个点而每个图元是一个三角形,那么你的Patch应该是由个点而不是3个点组成。

OpenGL中的绘制函数也需要据此作出调整,例如使用VBO绘制时调用的glDrawArrays函数,第一个参数将不再是以往的GL_TRIANGLES之类的而将改为GL_PATCHES,后面的几个参数也应与你的Patch大小一致。以我的代码为例:

这里我Buffer了顶点坐标和索引数组,由于是索引绘制所以使用了glDrawElements,可以看到我每个Patch由4个顶点组成。在调用glDrawElements绘制时第一个参数为GL_PATCHES,第二个参数为顶点总数(四边形数量*4)。这里的索引数组与以往的三角形索引数组不同,因为每个patch是四边形所以应该是四边形的索引数组。

接下来真正开始讲Tessellation Shader的编程部分。Tessellation实质上是由3部分组成,首先进入Tessellation Control Shader,然后进入Tessellation Primitive Generation,最后是Tessellation Evaluation Shader。其中中间的Tessellation Primitive Generation部分是不可编程的。

Tessellation Control Shader的作用是指定细分的等级。首先要决定其输出Patch的size,通过:

一般这个patch_size与OpenGL中指定的相同。但官方文档中提到TCS可以用于改变patch的size,应该就是在这里改,不过我还没遇到过这种情况。官方的原文如下:

The TCS can change the size of a patch, adding more vertices per-patch or providing fewer. However, a TCS cannot discard a patch (directly; it can do so indirectly), nor can it write multiple patches.

其输入常用的如下两个:

gl_InvocationID是Patch中顶点的索引数;

gl_in中是每个顶点的信息,包括位置、大小和裁剪距离(这个gl_ClipDistance没用过,不清楚它的&#;具体是什么含义)。

输出常用的有:

这两个TessLevel下面再提,gl_out和上面的gl_in相同,一般都是简单的pass through,如

gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;

这行代码的意思是将index为gl_InvocationID的顶点的输入坐标直接作为输出坐标,该操作会对Patch中所有的顶点进行。

Tessellation Control Shader的核心就是gl_TessLevelOuter和gl_TessLevelInner,前者决定外围的细分等级,后者决定内部的细分等级。其数&#;代表将该段分为几部分,即如果&#;为2,那么就是在中间插入1个点分为两段。为了便于理解我给个小例子:

对一个四边形做双线性插&#;,其细分等级如下:

结果如下图:

Outer分别对应了四边形的外面四条边,按右上左下的顺序。Inner对应了四边形内部的左右和上下。

GLSL Tessellation Shader的编程入门介绍

需要注意的是这两个Level的类型都是float。

接下来的Tessellation Primitive Generation部分会被Tessellation Evaluation Shader中的一些设置影响所以就先说Tessellation Evaluation Shader。

Tessellation Evaluation Shader首先是决定数据类型,如:

layout( quads, equal_spacing, cw ) in;

其输入控制有三部分,分别为:

Abstract patch tpye:

isolines,输入为一系列平行线,输出为一系列的线;

triangles,输入为一个三角形,输出为一系列三角形;

quads,输入为一个四边形,输出为一系列三角形。

Spacing:

equal_spacing,插&#;点之间均匀;

fractional_even_spacing,分段数量为偶数;

fractional_odd_spacing,分段数量为奇数。

Primitive odering:

cw,顺时针;

ccw,逆时针。

其中Spacing中的两个不太好理解,在上例基础上做些更改,

fractional_even_spacing:

fractional_odd_spacing:

也就是说,fractional_even_spacing先将非偶数的分割段变成偶数分割,然后保证偶数分割段长度相等,fractional_odd_spacing类比。(不知道有没有讲清楚,这个比较蛋疼)

最后再提一点,Tessellation一般都是在局部坐标系下进行,因此vertex shader往往是pass through,因而需要在Tessellation Shader中进行model view projection,但Tessellation是OpenGL4.0的特性,已经取消了ftransform()等,所以需要自己传矩阵,如:

在OpenGL中传入这两个矩阵

openGL 学习1 前两个月捣鼓osg,回头学opengl,找了一个很简单的中文教程。cae,hpc软件开发岗位估计是够不着了。还有些cad的岗位,所以要把opengl混熟。*OpenGL的平台无

1.环境搭建 一、在

【学习ARToolkit小记之初】 ARToolkit在VS(Win7 位)下的配置及第一个开发程序的编译与运行 学习ARToolkit已经快一个月了,刚刚接触时只是按照官网教程中的步骤一步一步的学习,其中遇到了许多问题,如OpenGL在位Win7下的配置问题、ARtoolkit在

标签: GLSL Tessellation Shader的编程入门介绍

本文链接地址:https://www.jiuchutong.com/biancheng/369501.html 转载请保留说明!

上一篇:在VS2013中配置Opengl(vs2013怎么配置环境)

下一篇:openGL 学习1(opengl入门视频教程)

  • 什么是增值税留底退税
  • 山西省税务申报网站
  • 政府补助是否可以抵扣税
  • 财产转让所得个人所得税优惠政策
  • 年度企业所得税做账会计分录
  • 增值税发票税率13%怎么回事
  • 混合销售行为如何缴纳增值税税率
  • 航天金税服务费诈骗
  • 抵扣白条账单是怎么回事
  • 票面3个点什么意思
  • 没有收入的小规模纳税人可以无票入费用吗?
  • 购进蔬菜的进项税额
  • 施工安全协议违约怎么办
  • 电子发票与纸质发票具有同等效力
  • 品种法怎么计算在产品成本
  • 购买生产用品会计分录
  • 材料入库时实收什么意思
  • 调增应纳税所得额
  • 福利费要交个人税吗
  • 理论增值额的含义
  • 投资性房地产处置时公允价值变动损益
  • 个税申报成功如何修改
  • 1697508432
  • scanserver.exe - scanserver是什么进程 有什么用
  • 如何在windows10搜索文件
  • php中的事务使用是什么
  • php字符串赋值
  • 税法的构成要素中,()是税法最基本的要素
  • 小刺猬 (© lorenzo104/Getty Images)
  • 替票报销违法吗
  • 前端使用vue的好处
  • 单元测试的测试工具
  • 给兼职员工的劳动补贴
  • 破解版微擎框架如何升级
  • 企业账户有什么好处
  • python3.4 numpy
  • python极客项目编程 豆瓣
  • 上个月开的发票这个月作废怎么做帐
  • 个体工商户可以开对公账户吗
  • 已交土地使用金的划拨商品房与商品房的的区别
  • db2replace函数用法
  • 银行询证函快递费计入什么科目
  • 资产负债表季报是累计三个月数据吗
  • 购买净资产为负数怎么办
  • 原材料的会计处理有哪些
  • 外购产品捐赠
  • 高铁票丢失了可以补打吗
  • 实际利率法如何理解
  • 公关费用计入什么科目比较好
  • 享受小微企业免征增值税政策
  • 月末制造费用转入生产成本
  • 哪些情况应收账款不能扣
  • 工资里计提五险什么意思
  • 行政事业单位负责人应当对本单位内部控制
  • 收到福利费的专用发票
  • 三证合一怎么看税务登记证
  • sql拆分函数
  • mysql清空表内容
  • 3种不用重装的手机
  • win10设置设备
  • Mac系统怎么设置开机密码
  • winpup32.exe - winpup32是什么进程 什么意思
  • 果粉必修课 盘点Mac OS X系统发展史
  • win10系统中怎么打开IE浏览器
  • win8.1锁屏壁纸设置
  • ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
  • jquery生成网页内容
  • jquery炫酷效果
  • bat批处理视频教程
  • cocos2dx游戏开发教程
  • jquery 报表
  • scp 将数据从一台linux服务器复制到另一台linux服务器
  • unity 3d脚本编程
  • Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent错误的记录。
  • python 递归函数与循环的区别
  • python3 冒泡排序
  • 2023年惠州契税最新规定
  • 张雪峰谈建筑专业
  • 四川税务法人实名采集
  • 广东省国家税务局电子发票系统,网络设置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设