《OpenGL编程指南》 笔记九 细分着色器

第九章 细分着色器

9.1 细分着色器

  • 顶点着色器的局限:顶点着色器在运行时无法创建新的几何体。它只是在处理当前顶点的过程中对其关联的数据进行更新而已,它甚至无法做到对图元中其他的顶点数据进行访问
  • 细分着色器可以实现生成三角形模型网格等类型。面片(patch)是一种新的几何图元类型
  • 细分着色在OpenGL管线中有两个着色阶段,用来生成几何图元的模型网格。
  • 在顶点着色阶段,我们需要设置所有的线段或者三角形来构成处理的模型
  • 而在细分阶段,首先要指定面片,也就是顶点的有序列表。当渲染面片的时候,将首先执行细分控制着色器,处理面片顶点,并设置面片中要生成多少几何数据。这是细分着色阶段一,细分控制着色器是可选的
  • 当细分控制着色器结束后,第二个着色器,即细分计算着色器,将负责把生成网格的顶点放置到细分坐标指定的位置,并且将它们发送到光栅化阶段,或者发送给几何着色器进行更多的处理
  • OpenGL会将细分控制着色器的输出传递给图元生成阶段,在其中生成几何图元的网格以及细分坐标,供细分计算着色器阶段使用。最后,细分计算着色器将每个顶点放置在最终网格的对应位置上

9.2 细分面片

  • 细分过程并不会对OpenGL的经典几何图元类型进行处理,即点、线段和三角形,它使用一种称做面片(patch)的新的图元
  • 实际中,如果已经启用细分着色器,那么将其他类型的几何体传递给它会生成一个GL_INVALID_OPERATION错误。反之,如果没有绑定任何细分着色器,那么渲染面片数据也会得到一个GL_INVALID_OPERATION错误
  • 面片就是一个传递给OpenGL的顶点列表,处理过程中需要保证顺序正确
  • 当渲染细分面片时,可以使用glDrawArrays()等OpenGL的绘制命令,然后设置绘制命令中的顶点总数,从顶点缓存对象中读取数据
  • void glPatchParameteri(GLenum pname, GLint value)

设置一个面片中顶点数量为value
pname 必须设置为GL_PATCH_VERTICES
一个面片的默认顶点数量为3

  • 绘制面片,OpenGL绘制命令的输入类型设置为GL_PATCHES

9.3 细分控制着色器

  • 在应用程序里建立面片之后,就可以调用细分控制着色器并完成下面的操作:
    1. 生成细分输出面片的顶点并传递到细分计算着色器,同时更新所有逐顶点或者逐面片的属性值
    2. 设置细分层次因数,以控制生成图元的操作。这些因数属于特殊的细分控制着色器变量,分别为gl_TessLevelInner和gl_TessLevelOuter,它们在细分控制着色器中是隐式声明的

9.3.1 生成输出面片的顶点

  • 细分控制着色器使用的是应用程序设置的顶点,也就是输入面片顶点(input-patch vertices),而生成的新的顶点列表就是输出面片顶点(output-patch vertices),它们保存在细分控制着色器的gl_out数组中
  • 细分控制着色器可以对应用程序传入的数据进行修改,也可以对输入面片顶点执行创建或者删除顶点的操作,然后生成输出面片顶点。我们可以通过这一功能来处理点精灵的数据,或者减少应用程序发送给OpenGL的数据总量,从而实现性能的提升
  • 输入面片顶点的数量通过glPatchParameteri()设置,输出面片顶点的数量通过布局限定符(layout)来
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值