Я разрабатываю шейдерную программу, использующую встроенную переменную gl_VertexID:
gl_VertexID — содержит индекс текущей вершины
Переменная определяется как целое число со знаком. Почему это не беззнаковый int? Что происходит, когда он используется с очень большими массивами (например, массивом длиной 2 ^ 30)? Обрабатывает ли GLSL это как беззнаковое целое число?
Я хочу использовать его содержимое в качестве вывода моего шейдера (например, записать его в выходной буфер FBO). Я буду читать его содержимое, используя glReadPixels с GL_RED_INTEGER в качестве формата и либо GL_INT, либо GL_UNSIGNED_INT в качестве типа. Который правильный?
Если я использую GL_INT, я не смогу обращаться к очень большим массивам.
Чтобы использовать GL_UNSIGNED_INT, я мог бы привести сгенерированный gl_VertexID к uint внутри моего шейдера, но опять же, как получить доступ к длинному массиву?
GLsizei
тоже подписано. Поэтому, если вы считаете, что единственный способ отрисовки определенного количества вершин уже отсекает 1 бит, имеет смысл только то, что идентификатор вершины в GLSL также делает то же самое.gl_VertexID
не обязательно является индексом элемента (который не имеет знака), но также может быть номером нарисованной вершины (например, 45-я вершина из знаковогоcount
из 999 в вашем вызовеglDrawArrays (...)
). - person Andon M. Coleman   schedule 26.08.2014