图形渲染流水线如下:
1.顶点着色器
#version 410 core
void main(void)
{
const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0));
gl_Position = vertices[gl_VertexID];
}
每个顶点上都运行一次顶点着色器。gl_Position和gl_VertexID是内部变量。gl_VertexID表示当前顶点的索引,gl_Position表示位置。
2.曲面细分着色器
曲面细分着色器将复杂的曲面转换为简单的点,线,三角形等。它分为三部分:曲面细分控制着色器(Tessellation Control Shaders),曲面细分引擎(The Tessellation Engine),曲面细分求值着色器(Tessellation Evaluation Shaders)。
2.1 曲面细分控制着色器
曲面细分控制着色器负责确定曲面细分等级。
#version 410 core
layout (vertices = 3) out;
void main(void)
{
if (gl_InvocationID == 0)
{
gl_TessLevelInner[0] = 5.0;
gl_TessLevelOuter[0] = 5.0;
gl_TessLevelOuter[1] = 5.0;
gl_TessLevelOuter[2] = 5.0;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
layout (vertices = 3) out;表示生成的控制点的个数。gl_TessLevelInner和gl_TessLevelOuter是内部变量,分别表示内外曲面细分等级(等级越高细分越精细)。gl_in和gl_out也是内部变量,分别表示输入输出数据。gl_InvocationID表示索引。
2.2 曲面细分引擎
曲面细分引擎是固定管线,将复杂的曲面转换为简单的点,线,三角形等。
2.3 曲面细分求值着色器
#version 410 core
layout (triangles, equal_spacing, cw) in;
void main(void)
{
gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +
(gl_TessCoord.y * gl_in[1].gl_Position) +
(gl_TessCoord.z * gl_in[2].gl_Position);
}
在细分后生成的顶点上都运行该着色器。所以,当曲面细分的精度越高,生成的顶点就越多,该着色器运行的次数就越多。其中设置细分模式的语句如下:
layout (triangles, equal_spacing, cw) in
表示以等分边界的方式,顺时针生成三角形。
gl_TessCoord表示生成顶点的重心。
3.片元着色器
片元着色器负责计算片元的颜色。
#version 410 core
out vec4 color;
void main(void)
{
color = vec4(0.0, 0.8, 1.0, 1.0);
}
4.渲染结果
以下是在不同的细分精度下的渲染结果:
gl_TessLevelInner[0] = 5.0;
gl_TessLevelOuter[0] = 5.0;
gl_TessLevelOuter[1] = 5.0;
gl_TessLevelOuter[2] = 5.0;
gl_TessLevelInner[0] = 5.0;
gl_TessLevelOuter[0] = 2.0;
gl_TessLevelOuter[1] = 2.0;
gl_TessLevelOuter[2] = 2.0;
gl_TessLevelInner[0] = 2.0;
gl_TessLevelOuter[0] = 5.0;
gl_TessLevelOuter[1] = 5.0;
gl_TessLevelOuter[2] = 5.0;
gl_TessLevelInner[0] = 2.0;
gl_TessLevelOuter[0] = 2.0;
gl_TessLevelOuter[1] = 2.0;
gl_TessLevelOuter[2] = 2.0