Мой вопрос заключается в том, что все вызовы Tesellation Control Shader приводят к одному и тому же результату, поэтому OPENGL должен вызывать этот шейдер много раз для каждого патча.
Например: My Tesellation Control Shader вычисляет контрольные точки для поверхности Безье. Он принимает массив из трех вершин, который агрегируется ранее из вершинных шейдеров.
// attributes of the input CPs
in vec3 WorldPos_CS_in[];
Мой размер патча равен 3, поэтому Tesellation Control Shader вызывается три раза для одного и того же входа, за исключением gl_invocatinoID, и затем все они выдают одинаковые следующие контрольные точки:
struct OutputPatch
{
vec3 WorldPos_B030;
vec3 WorldPos_B021;
vec3 WorldPos_B012;
vec3 WorldPos_B003;
vec3 WorldPos_B102;
vec3 WorldPos_B201;
vec3 WorldPos_B300;
vec3 WorldPos_B210;
vec3 WorldPos_B120;
vec3 WorldPos_B111;
vec3 Normal[3];
vec2 TexCoord[3];
};
// attributes of the output CPs
out patch OutputPatch oPatch;
И также та же информация, которая помогает OpenGL разделить этот патч на координаты tesellation:
// Calculate the tessellation levels
gl_TessLevelOuter[0] = gTessellationLevel;
gl_TessLevelOuter[1] = gTessellationLevel;
gl_TessLevelOuter[2] = gTessellationLevel;
gl_TessLevelInner[0] = gTessellationLevel;
Понятно, что все Tes Control Shader выполняют одинаковую работу. Это тратит ресурсы? Почему Tesellation Control Shader нужно вызывать по одному разу для каждого патча?
Что ж, вызовы управляющего шейдера не дают точно такой же результат, потому что выходные данные контрольной точки очевидно различны для каждого. Но это педантично.
В вашей программе, и во всех моих до сих пор, да, управляющий шейдер делает одно и то же для каждой контрольной точки, и уровень тесселяции не меняется.
Но предположим, что у вас есть шейдер, генерирующий новые атрибуты для каждой контрольной точки, текстуры нормальные или что-то еще? Тогда шейдер будет генерировать разные результаты для каждого. Приятно иметь дополнительную гибкость, если вам это нужно.
Современные графические процессоры стараются делать как можно больше параллельно. Более старые геометрические шейдеры имеют один вызов, генерирующий несколько выходных данных. На современных графических процессорах более эффективно, а не менее, иметь несколько вызовов, каждый из которых генерирует один вывод.
Других решений пока нет …