C++ 如何在三角形细分求值着色器中插值UV贴图坐标?

C++ 如何在三角形细分求值着色器中插值UV贴图坐标?,c++,opengl,shader,interpolation,uv-mapping,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_

我尝试在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
是逐顶点(而不是逐面片)。 看见 和


生成并发送到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]; 

尝试过但没有成功,因为UV_tcs是一个vec2,没有第三个组件。你说得太对了!谢谢!现在一切正常!
UV_tes = 
    gl_TessCoord.x * UV_tcs[0] +
    gl_TessCoord.y * UV_tcs[1] + 
    gl_TessCoord.z * UV_tcs[2];