Tessellation Shader的GLSL入门实现: 平面

此文续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中找到。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值