Я попытался таким образом интерполировать координаты UV в моем TES, но безуспешно. Как правильно выполнить интерполяцию 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[];
Увидеть Хронос 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];
Других решений пока нет …