Tessellation Shader的GLSL入門實現: 平面

iteye_21202發表於2013-05-22

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





相關文章