我尝试在我的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];
}
答案 0 :(得分:1)
在您的情况下,曲面细分原语的类型为triangle
layout (triangles, equal_spacing, cw) in;
并且输入变量UV_tcs
是每个顶点(而不是每个补丁)。
见Tessellation Control Shader - Outputs
和Tessellation 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 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];