Как вы интерполируете координаты UV-картирования в шейдере оценки тесселяции треугольника?

Я попытался таким образом интерполировать координаты 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];

}

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];
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]