admin管理员组

文章数量:1537352

OpenGL超级宝典(第7版)笔记7 细分曲面初介绍 清单3.7-3.8

文章目录

  • OpenGL超级宝典(第7版)笔记7 细分曲面初介绍 清单3.7-3.8
  • 1 细分曲面
  • 2 细分曲面控制着色器TCS
          • 遗留的问题:gl_ClipDistance[]的值有什么用?
          • 遗留的问题:gl_TessLevelOuter中如果设置为非整数那会怎样?
  • 3 细分曲面引擎
  • 4 细分曲面评估着色器TES
          • 遗留的问题:TES中的gl_TessCoord究竟是什么,为什么说清单这里是没有改变顶点的位置?
          • 遗留的问题:TES在处理线,三角面等高阶基元时运行多少次,如何运行?
  • 5 编译绘制运行
  • 6 引用参考资料
  • 7 实际效果
  • 8 总结


上一次介绍了着色器之间的数据传输,其特点是单向性、对应性,当然还要注意顶点着色器到片段着色器的插值问题。
从这一篇开始我们将介绍其他种类的着色器,这些着色器并不是每个程序必须的,但它们可以提供更多更强大的功能。我们还是跟着书籍(OpenGL超级宝典第7版)来粗略的过一遍每种着色器(并不会非常细致),让大家熟悉一下管线的流程,也可以让大家记住每种着色器的用途,方便我们以后使用。

注意从本篇开始就可能会出现 遗留的问题:…> 像这样的小节(这是为了我以后补充留的标题),也就是下面关于遗留的问题有关的描述都不一定是准确的,还请大家见谅,毕竟我也是初学者,也希望大家指正,当然我以后要是弄清楚了会再进行修改,也有可能我弄懂了之后忘记修改了。

本篇是关于细分曲面控制着色器、细分曲面引擎、细分曲面评估着色器三个环节的简介。

1 细分曲面

由于我们都是使用三角面来表示曲面的,所以我们用这种方式表达的曲面其实并不精确,用到的三角面越多,我们显示的结果越接近真正的曲面(例如下图中的球形,当三角面变多时越来越像球形了,表面也变得更"光滑"了)

(截图来源于:哔哩哔哩闫令琪计算机图形学课程p12 9分50左右)
但是问题在于,有时会有大量的物体,每个物体有含有很多的曲面,每个曲面有包含很多的三角面,这导致进行一次加载要导入超级多的顶点,假如我们还想让曲面更精细,那需要的顶点数量将非常多,那将拖慢电脑的运行。所以我们采用曲面细分的方法,导入少量的三角形面然后通过算法让大三角形面分裂成很多的小三角面,并通过算法更改小三角面的顶点位置,让它们更贴合真正的曲面(见下图:曲面细分后曲面更接近真实的牛的形状了)

(截图来源于:哔哩哔哩闫令琪计算机图形学课程p12 7分20左右)

OpenGL中实现曲面的细分功能的就是,细分曲面控制着色器、细分曲面引擎、细分曲面评估着色器这三者。其中细分曲面控制着色器用于生成控制点并设置细分等级(比如把边缘分为几份),细分曲面引擎用于通过前面设定的控制点和细分等级,真正分割曲面并生成大量的顶点,细分曲面评估着色器用于更改分割后小三角面顶点的移动更改(这让曲面更贴合,更"光滑")。

2 细分曲面控制着色器TCS

前面已经讲过了细分曲面控制着色器用于计算控制点信息并设置细分等级,这样做了设置之后细分曲面引擎才能根据我们设定的控制点和细分等级来生成大量的顶点。

在计算控制点之前,首先是设置控制点的数量,用glPatchParameteri();来设置。

glPatchParameteri(GL_PATCH_VERTICES, 3);//只需要在render();中设定一次就行了

其中第一个参数指示我们要设置细分曲面控制着色器的哪些东西,这里我们填写的是GL_PATCH_VERTICES即我们要设置每个patch(贴片)的控制点数量(patch指的就是传入到细分曲面控制着色器的那些东西,比如传入的是三角形,是四边形等等)。我们这里设置控制点数量为3。

注意这里设置的控制点数量为输入细分曲面控制着色器的控制点数量,而由于细分曲面控制着色器是用来计算控制点相关信息的着色器,它其实可以产生更多的控制点或删去一些控制点(即控制点输入数量可以不等于输出的控制点数量)。

英文原文:The number of control points per patch can be changed such that the number of control points that is output by the tessellation control shader can differ from the number of control points that it consumes. The number of control points produced by the control shader is set using an output layout qualifier in the control shader’s source code.

中文原文:每个贴片的控制点数量可以更改,因此细分曲面控制着色器的控制点数量与其使用的控制点数量不同。控制着色器生成的控制点数量使用控制着色器源代码中的输出配置限定符设置。

而我们可以通过:

layout (vertices=3) out;

来设置当前细分曲面控制着色器的输出控制点数量是多少(虽然我们这里设置的输入控制点数量等于输出控制点数量),这里设置输出的控制室数量为3。

注意
细分曲面控制着色器TCS是每有一个控制点输出,就会运行一次,也就是说如果为layout (vertices=4) out;那么TCS会在该patch上运行4次。

之后我们要在着色器中设置具体的细节了。这里给出清单3.7
清单3.7 我们的第一个细分曲面控制着色器

#version 450 core						
layout (vertices=3) out;				
void main(void)						
{
   										
	if(gl_InvocationID==0){
   				
		gl_TessLevelInner[0]=5.0;		
		gl_TessLevelOuter[0]=2.0;		
		gl_TessLevelOuter[

本文标签: 曲面清单宝典笔记OpenGL