此文续http://blog.csdn.net/lsldd/article/details/8794823
这次来看一看如何细分一个平面(quads)
对于quads细分算法而言,需要传递6个细分参数:4个Outer和2个Inner。每个参数控制的细分如下图所示。
out1:控制四边形左边、外侧的细分数量。上图为1.
out2:控制四边形下边、外侧的细分数量。上图为2.
out3:控制四边形右边、外侧的细分数量。上图为3.
out4:控制四边形上边、外侧的细分数量。上图为4.
out1:控制四边形横向、内侧的细分数量。上图为5.
out1:控制四边形纵向、外侧的细分数量。上图为6.
Vertex Shader和Fragment Shader与之前文章一样,什么都不用干。现在看看TE 和TS shader。
Tessellation Control Shader:
#version 400
layout( vertices=4 ) out;
uniform int Outer0;
uniform int Outer1;
uniform int Outer2;
uniform int Outer3;
uniform int Inner0;
uniform int Inner1;
void main()
{
// Pass along the vertex position unmodified
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
gl_TessLevelOuter[0] = float(Outer0);
gl_TessLevelOuter[1] = float(Outer1);
gl_TessLevelOuter[2] = float(Outer2);
gl_TessLevelOuter[3] = float(Outer3);
gl_TessLevelInner[0] = float(Inner0);
gl_TessLevelInner[1] = float(Inner1);
}
这里就是设置6个细分参数。已经解释过。注意的是在代码中参数标号我从0开始。
Tessellation Evaluation Shader:
#version 400
layout( quads, equal_spacing, ccw ) in;
uniform mat4 ModelViewProjectionMatrix;
void main()
{
float u = gl_TessCoord.x;
float v = gl_TessCoord.y;
vec4 p0 = gl_in[0].gl_Position;
vec4 p1 = gl_in[1].gl_Position;
vec4 p2 = gl_in[2].gl_Position;
vec4 p3 = gl_in[3].gl_Position;
// Linear interpolation
gl_Position =
p0 * (1-u) * (1-v) +
p1 * u * (1-v) +
p3 * v * (1-u) +
p2 * u * v;
// Transform to clip coordinates
gl_Position = ModelViewProjectionMatrix * gl_Position;
}
注意这里使用了经典的四边形插值算法,即已知4个顶点,根据gl_TessCoord中的u,v参数插值计算对应的点坐标。
示例代码和讲解也可以从OpengGL Shading Language Cook Book中找到。