如何在曲面细分期间计算gl_TessCoord?

Osc*_*car 3 opengl glsl jogl

目前我正在学习OpenGL的曲面细分着色器.但是当涉及曲面细分评估着色器中的内置变量"gl_TessCoord"时,我无法理解它是如何计算的.

我知道当使用不同的镶嵌模式(四边形或三角形)时,"gl_TessCoord"是不同的.我检查了蓝皮书和红皮书,但他们只给出了一个粗略的解释,告诉它代表输入顶点的权重.有任何想法吗?

以下是矩形曲面细分的示例代码:

#version 430 core
layout ( quads) in;
void main( void)
{
    // Interpolate along bottom edge using x component of the
    // tessellation coordinate
    vec4 p1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
    // Interpolate along top edge using x component of the
    // tessellation coordinate
    vec4 p2 = mix(gl_in[2].gl_Position, gl_in[3].gl_Position, gl_TessCoord.x);
    // Now interpolate those two results using the y component
    // of tessellation coordinate
    gl_Position = mix(p1, p2, gl_TessCoord.y);
}
Run Code Online (Sandbox Code Playgroud)

以下是三角形曲面细分的示例代码:

#version 430 core
layout ( triangles) in;
void main( void)
{
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +
    (gl_TessCoord.y * gl_in[1].gl_Position) +
    (gl_TessCoord.z * gl_in[2].gl_Position);
}
Run Code Online (Sandbox Code Playgroud)

And*_*man 5

gl_TessCoord 与所有原始拓扑表示相同的概念.

这个向量是当前基元中的位置,最好不要将它视为x,yz.由于它相对于表面,u(vw可选)更直观.你可以调用任何你想要的坐标(例如xyz,rgb,stpuvw),你要知道,不过uvw是规范的符号.

OpenGL 4.5(核心配置文件)  -  11.2.2 Tessellation Primitive Generation  - p.392

由基元生成器生成的每个顶点在标准化参数空间中具有关联的(u,v,w)或(u,v)位置,参数值在[0,1]范围内,如图11.1所示.

对于三角形,顶点位置是重心坐标(u,v,w),其中u + v + w =​​ 1,并指示三角形的三个顶点对顶点位置的相对影响.

对于四边形和等值线,位置是(u,v)坐标,指示顶点相对于细分矩形的相对水平和垂直位置

在四边形的情况下,每个分量测量距单位正方形的两个边缘的距离.在三角形的情况下,它是距三角形的三个边缘(重心坐标)的距离.这就是为什么你的四边形例如镶嵌着色只使用uv,而三角形的例子使用u,vw.

为了更好地说明这一点,请考虑以下图表:

  在此输入图像描述