Тесселяционные шейдеры
Я пытаюсь научиться тесселяции шейдеров в openGL 4.1. Я понял большинство вещей. У меня есть один вопрос.
Что такое gl_InvocationID?
Любое тело, пожалуйста, объясните, как-то просто?
1 ответ
gl_InvocationID
имеет два текущих использования, но оно представляет одну и ту же концепцию в обоих.
В Geometry Shaders вы можете сделать так, чтобы GL запускал ваш геометрический шейдер несколько раз для каждого примитива. Это полезно в сценариях, где вы хотите нарисовать одну и ту же вещь с нескольких точек зрения. Каждый раз, когда шейдер работает с одним и тем же набором данных, gl_InvocationID
увеличивается
Общая тема между Geometry и Tessellation Shaders заключается в том, что каждый вызов использует одни и те же входные данные. Шейдер управления тесселяцией может читать каждую вершину во входном патче-примитиве, и вам действительно нужно gl_InvocationID
чтобы понять, какую точку данных вы должны обрабатывать.
Вот почему вы обычно видите, что шейдеры управления тесселяцией написаны примерно так:
gl_out [gl_InvocationID].gl_Position = gl_in [gl_InvocationID].gl_Position;
gl_in
а также gl_out
потенциально очень большие массивы в шейдерах управления тесселяцией (равны по размеру GL_PATCH_VERTICES
), и вы должны знать, какая вершина вас интересует.
Кроме того, имейте в виду, что вы не можете писать в любой индекс, кроме gl_out [gl_InvocationID]
из шейдера управления тесселяцией. Это свойство продолжает вызывать шейдеры управления Tessellation в параллельном порядке (оно устраняет зависимости порядка и предотвращает перезапись данных, которые уже были записаны другим вызовом).