如何在三角形曲面细分评估着色器中插值 UV 映射坐标?

How do you interpolate UV mapping coords in a triangle tessellation evaluation shader?

本文关键字:插值 UV 映射 坐标 三角形 曲面 评估 细分      更新时间:2023-10-16

我试图在我的TES中以这种方式插值UV坐标,但没有成功。进行UV坐标插值的正确方法是什么? 我说我正在使用三角形镶嵌。

#version 450 core
layout (triangles, equal_spacing, cw) in;
in vec2 UV_tcs[];
out vec2 UV_tes;
void main()
{
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 );
UV_tes = gl_TessCoord.x * UV_tcs[0] + gl_TessCoord.y * UV_tcs[1];
}

在您的情况下,镶嵌基元的类型是triangle

layout (triangles, equal_spacing, cw) in;

输入变量UV_tcs是每个顶点(而不是每个补丁)。 请参见曲面细分控制着色器 - 输出 和曲面细分评估着色器 - 输入。

in vec2 UV_tcs[];


参见Khronos OpenGL维基 - 镶嵌 - 三角形

生成并发送到TES的每个顶点都将被赋予重心坐标作为gl_TessCoord输入。此坐标定义此顶点在抽象三角形图块中的位置。抽象三角形补丁的 3 个顶点的重心坐标如图所示。所有其他顶点将相对于这些顶点指定。

要在三个顶点中的每一个值处执行 3 个值之间的线性插值,请执行以下操作:


vec3 accum = vec3(0.0f)
accum += gl_TessCoord[0] * value[0]
accum += gl_TessCoord[1] * value[1]
accum += gl_TessCoord[2] * value[2]
这意味着属性必须根据三角形基元的重心坐标(gl_TessCoord.xyz)进行插值,与属性的类型无关。

你必须像对位置(gl_in[].gl_Position)一样做,像这样更改你的代码:

UV_tes = 
gl_TessCoord.x * UV_tcs[0] +
gl_TessCoord.y * UV_tcs[1] + 
gl_TessCoord.z * UV_tcs[2];