glClearBuffer * разъяснение

#c #opengl-es

#c #opengl-es

Вопрос:

В настоящее время я использую glClearBuffer* функции для очистки буферов рисования в проекте, работающем в OpenGL ES 3.0. В документации glClearBuffer указано следующее:

Команды glClearBufferfv, glClearBufferiv и glClearBufferuiv следует использовать для очистки цветовых буферов с фиксированной запятой, целых чисел со знаком и целых чисел без знака соответственно.

Правильно ли я понимаю это следующим образом:

Использовать glClearBufferfv , если буфер рисования имеет GL_FLOAT тип
, Использовать glClearBufferiv , если буфер рисования имеет GL_INT тип
, Использовать glClearBufferuiv , если буфер рисования имеет GL_UNSIGNED_INT тип

Это правильно? Я спрашиваю, потому что нет упоминания (из того, что я могу сказать) о правильном способе очистки буфера отрисовки других типов, таких как GL_BYTE и GL_UNSIGNED_BYTE .

Спасибо!

Ответ №1:

fv Версия должна использоваться для буферов с нормализованными или графическими форматами с плавающей запятой. Версии iv и uiv следует использовать для буферов с целочисленными форматами со знаком и без знака.

Это не ограничивает их определенным форматом, а общими категориями форматов. GL_RGBA8UI является целочисленным форматом без знака, как есть GL_R32UI .

GL_INT это не какой-либо формат изображения.

Комментарии:

1. Я знаю GL_INT , что это не формат, я не упоминал, что это был один. Но вместо того, чтобы иметь регистр переключения, в котором перечислены все известные форматы, разве нельзя было бы проверить тип формата?

2. @Deathicon: » Но вместо того, чтобы иметь регистр переключения, в котором перечислены все известные форматы «, зачем вам его иметь? Вообще говоря, вы знаете, каковы форматы ваших целей рендеринга. В большинстве случаев это жестко запрограммировано в вашем приложении. Итак, зачем вам нужен оператор switch?

3. Это не жестко запрограммировано, в проекте пользователи могут создавать контент с типом объектов рендеринга по мере необходимости.

4. @Deathicon: тогда пользователь должен знать, какой «тип» он создал для цели рендеринга, и, следовательно, сообщить вам, как его следует очистить, когда придет время. Поэтому, если они создают нормализованное изображение или изображение с плавающей запятой, они должны вызвать соответствующую функцию очистки для этого изображения. В конце концов, пользователь должен указать значение для его очистки, поэтому он должен знать, какое значение нужно предоставить.

5. Хорошо, я думаю, я не могу проверить тип , поскольку этой информации недостаточно для вызова правильного glClearBuffer , поскольку, например GL_R8_SNORM , нормализован со знаком, но GL_R8I имеет подписанный интегральный формат, и оба имеют GL_BYTE тип, но требуют fv и iv соответственно.