почему gl_VertexID не является целым числом без знака?

Я разрабатываю шейдерную программу, использующую встроенную переменную 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 внутри моего шейдера, но опять же, как получить доступ к длинному массиву?


person Pierluigi    schedule 26.08.2014    source источник
comment
Так и должно быть, GLsizei тоже подписано. Поэтому, если вы считаете, что единственный способ отрисовки определенного количества вершин уже отсекает 1 бит, имеет смысл только то, что идентификатор вершины в GLSL также делает то же самое. gl_VertexID не обязательно является индексом элемента (который не имеет знака), но также может быть номером нарисованной вершины (например, 45-я вершина из знакового count из 999 в вашем вызове glDrawArrays (...)).   -  person Andon M. Coleman    schedule 26.08.2014
comment
Хорошая точка зрения! Таким образом, решение для большого массива состоит в том, чтобы рисовать их кусками и считывать индексы (с учетом возможного смещения). Я бы принял это решение, если вы напишете его как ответ (вместо комментария)   -  person Pierluigi    schedule 26.08.2014


Ответы (2)


Скорее всего исторические причины. gl_VertexID впервые был определен как часть расширения EXT_gpu_shader4. Это расширение определено на основе OpenGL 2.0:

Это расширение написано в соответствии со спецификацией OpenGL 2.0 и версией 1.10.59 спецификации языка шейдинга OpenGL.

В то время GLSL еще не поддерживал беззнаковые типы. Они не были представлены до OpenGL 3.0.

person Reto Koradi    schedule 26.08.2014

Я не могу сказать, может ли OpenGL рассматривать идентификатор вершины как целое число без знака, но вы, скорее всего, можете создать свой собственный (полный 32-битный) идентификатор. Я сделал это некоторое время назад, указав атрибут цвета вершины rgba8888, который преобразуется в идентификатор в шейдере путем битового сдвига компонентов r, g, b и a.

Делая это, я также заметил, что это ничуть не медленнее, чем использование gl_VertexID, которое, казалось, вносило некоторые накладные расходы. В настоящее время просто используйте атрибут unsigned int.

Кроме того, мне интересно, почему вы хотите прочитать gl_VertexID? (это я делал один раз для алгоритма и он оказался не продуманным и сейчас заменен на что-то более эффективное ;))

person Thomas    schedule 26.08.2014