OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD
文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code
9 细分着色器
绘制流水线
从绘制流水线中可以看到细分着色器分两个,细分控制着色器和细分计算着色器,在顶点着色器后依次执行。细分着色器从名字可以看出细分图形,细分后可以绘制更多点从而使得使得画面更加精致。通过细分着色器可以控制绘制3D模型使用的顶点数,根据实际情况减少增加顶点,提高性能。
处理步骤
- 顶点数据
- 顶点着色器处理并输出顶点数据
- 根据glPatchParameteri(GL_PATCH_VERTICES, n)中的参数n,生成path,每个path包含n个顶点数据
- 细分控制着色器,对每个path进行处理,path中点的数据存放在gl_in[]数组中。细分控制控制着色器可以通过layout(vertices = n) out控制每个path输出到细分计算着色器的点数量,每输出一个点就需要执行一次细分控制着色器,输出的数据存放在gl_out[]数组中,gl_InvocationID代表当前输入顶点的
- 计算path需要细分的顶点数和每个点的细分坐标
- 细分计算着色器,按path进行处理,输入点数据存放在gl_in[]数组中,gl_in[]数组中的数据是细分控制着色器中的输出。细分计算着色器对每一个细分后的点都要执行一次,输出一个点。输出点的位置可以根据细分坐标和gl_in中的数据计算得到。
- 细分完成,继续其他绘制操作
细分控制着色器只是控制图形各个边和内部细分的点数,通过gl_TessLevelOuter和gl_TessLevelInner控制
细分计算着色器可控制细分的方法,可以是四边形(quads),三角形(triangles),线段(isolines)细分, 通过layout(param, param, …) in控制。
细分正方形
细分后点的细分坐标为(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: