テッセレーションコントロールシェーダ

tessellation-control-shader.png

出力

ジオメトリシェーダが複数のプリミティブを出力するのに対し、
テッセレーションコントロールシェーダは1つの頂点からpatchを出力する。

cpp側でのセットアップ

char *tcsSource; // Null terminated string
GLuinttcs= glCreateShader(GL_TESS_CONTROL_SHADER);
glShaderSource(tcs, 1, tcsSource, NULL);
glCompileShader(tcs);
glAttachShader(program, tcs)
char* tesSource; // Null terminated string
GLuinttes= glCreateShader(GL_TESS_EVALUATION_SHADER);
glShaderSource(tes, 1, tesSource, NULL);
glCompileShader(tes);
glAttachShader(program, tes);
glLinkProgram(program);

Tessellation Control Shader(TCS)

各頂点にて一回だけ実行される。
Computes LOD per patch
—gl_TessLevelOuter[4]
—gl_TessLevelInner[2]
Optional
—If not present tessellation level will be set to their default value
—Default value can be changed using:
glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, outerLevels)
glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, innerLevels)

Tessellation Control shaderのサンプル

layout(vertices = 3) out;
uniform float tessLevelOuter;
uniform float tessLevelInner;
void main()
{
gl_TessLevelOuter[0] = tessLevelOuter;
gl_TessLevelOuter[1] = tessLevelOuter
gl_TessLevelOuter[2] = tessLevelOuter;
gl_TessLevelInner[0] = tessLevelInner;
gl_out[gl_InvocationID].gl_Position= gl_in[gl_InvocationID].gl_Position;
}

Uses tessellation levels to decompose a patch into a new set of primitive
Each vertex is assigned a (u, v) or (u, v, w) coordinate

opengl4 tessellation

サポートサイト Wikidot.com opengl4tessellation