OpenGL 编程指南(第八版)学习笔记——9 细分着色器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlk1229/article/details/81838473

OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD

文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code

9 细分着色器

绘制流水线

从绘制流水线中可以看到细分着色器分两个,细分控制着色器和细分计算着色器,在顶点着色器后依次执行。细分着色器从名字可以看出细分图形,细分后可以绘制更多点从而使得使得画面更加精致。通过细分着色器可以控制绘制3D模型使用的顶点数,根据实际情况减少增加顶点,提高性能。

 

处理步骤

  1. 顶点数据
  2. 顶点着色器处理并输出顶点数据
  3. 根据glPatchParameteri(GL_PATCH_VERTICES, n)中的参数n,生成path,每个path包含n个顶点数据
  4. 细分控制着色器,对每个path进行处理,path中点的数据存放在gl_in[]数组中。细分控制控制着色器可以通过layout(vertices = n) out控制每个path输出到细分计算着色器的点数量,每输出一个点就需要执行一次细分控制着色器,输出的数据存放在gl_out[]数组中,gl_InvocationID代表当前输入顶点的
  5. 计算path需要细分的顶点数和每个点的细分坐标
  6. 细分计算着色器,按path进行处理,输入点数据存放在gl_in[]数组中,gl_in[]数组中的数据是细分控制着色器中的输出。细分计算着色器对每一个细分后的点都要执行一次,输出一个点。输出点的位置可以根据细分坐标和gl_in中的数据计算得到。
  7. 细分完成,继续其他绘制操作

 

 

细分控制着色器只是控制图形各个边和内部细分的点数,通过gl_TessLevelOuter和gl_TessLevelInner控制

细分计算着色器可控制细分的方法,可以是四边形(quads),三角形(triangles),线段(isolines)细分, 通过layout(param, param, …) in控制。

扫描二维码关注公众号,回复: 2910048 查看本文章

 

细分正方形

细分后点的细分坐标为(u, v) = gl_TessCoord.xy,u和v的范围为[0, 1] 细分后默认的图元为三角形,具体细分方法参考书籍

例子,代码9.5-01quads:

 

细分线段

细分后点的细分坐标为(u, v) = gl_TessCoord.xy, 细分后默认的图元为线段,具体细分方法参考书籍

例子,代码9.5-02Line:

 

细分三角形

细分后点的细分坐标为(u, v, w) = gl_TessCoord.xyz, 细分后默认的图元为三角形。(u, v, w)并不是一个三维坐标,其每个分量都代表点到一条底边的距离除以对应底边上的高。这三个分量的和u+v+w=1,u,v,w 范围[0, 1]。书中此处有个错误,重心坐标应该是(1/3, 1/3, 1/3)。

例子,代码9.5-03Triangel:

 

猜你喜欢

转载自blog.csdn.net/wlk1229/article/details/81838473