【问题标题】:How do you interpolate UV mapping coords in a triangle tessellation evaluation shader?如何在三角形镶嵌评估着色器中插入 UV 贴图坐标?
【发布时间】:2018-08-27 08:42:38
【问题描述】:

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

}

【问题讨论】:

  • 试过但没用,因为 UV_tcs 是 vec2,没有第三个组件
  • 你说的太对了!非常感谢!现在工作正常!

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


【解决方案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 的顶点都将作为 gl_TessCoord 输入给出 Barycentric coordinates。这个坐标定义了这个顶点在抽象三角形补丁中的位置。抽象三角形贴片的 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 coordinates (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]; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多