如何在三角形曲面细分评估着色器中插入UV贴图坐标?

时间:2018-03-18 19:23:08

标签: c++ opengl shader interpolation uv-mapping

我尝试在我的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];

}

1 个答案:

答案 0 :(得分:1)

在您的情况下,曲面细分原语的类型为triangle

layout (triangles, equal_spacing, cw) in;

并且输入变量UV_tcs是每个顶点(而不是每个补丁)。 见Tessellation Control Shader - OutputsTessellation Evaluation Shader - Inputs

in vec2 UV_tcs[];


Khronos OpenGL wiki - Tessellation - Triangles

  

生成并发送到TES的每个顶点将被赋予Barycentric coordinates作为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]


这意味着必须根据三角形基元的Barycentric coordinatesgl_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];