您的位置:首页 > 其它

Tessellation Shader的GLSL入门实现: 平面

2013-05-22 11:06 861 查看
此文续/article/7834425.html

这次来看一看如何细分一个平面(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中找到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: