Значение и значение параметра InternalFormat, Format и Type для текстур WebGL - PullRequest
0 голосов
/ 24 апреля 2019

В WebGL для вызовов texSubImage2D и readPixels требуются параметры Format и Type. Кроме того, для texSubImage2D требуется параметр InternalFormat. Несмотря на то, что легко найти документацию о том, какие комбинации этих параметров являются действительными, неясно, что конкретно означают эти параметры и как их эффективно использовать, особенно учитывая, что некоторые внутренние форматы могут быть соединены с несколькими типами, например R16F / HALF_FLOAT против R16F / FLOAT или GL_R11F_G11F_B10F / FLOAT против GL_R11F_G11F_B10F / GL_UNSIGNED_INT_10F_11F_11F_REV (где используется обозначение InternalFormat / Type)

Также оба этих вызова API можно использовать в сочетании с параметром pixels, который может быть TypedArray - в этом случае неясно, какие варианты TypedArray действительны для данного InternalFormat / Format / Type комбо (и какой выбор оптимален с точки зрения избежания каста)

Например, верно ли, что внутренняя память, используемая графическим процессором на тексель, определяется исключительно InternalFormat - либо в зависимости от реализации (например, форматы WebGL1 unsized), либо для некоторых новых добавлено InternalFormat с в WegGL2, полностью указанным способом.

Связаны ли параметры Format и Type главным образом с тем, как данные собираются и выводятся из ArrayBuffers? Например, если я использую GL_R11F_G11F_B10F / GL_UNSIGNED_INT_10F_11F_11F_REV Означает ли это, что я должен передать texSubImage2D Uint32Array, где каждый элемент массива тщательно перемешан в javascript, тогда как если я использую GL_R11F_G11F_B10F / Float, тогда я должен использовать Float32Array с тремя раз количество элементов, как в предыдущем случае, и WebGL будет обрабатывать немного вертеться для меня? Пытается ли WebGL проверить, что пройденный мною TypedArray соответствует выбранному мною Format / Type, или он работает напрямую с базовым ArrayBuffer? Мог ли я использовать Float64Array в последнем случае? А что делать с HALF_FLOAT?

1 Ответ

0 голосов
/ 24 апреля 2019

Похоже, что на большую часть вопроса можно ответить, обратившись к разделу 3.7.6 Объекты текстуры спецификации WebGL2 . В частности, информация в таблице, найденной в документации для texImage2D, которая разъясняет, какой TypedArray требуется для каждого Type:

TypedArray  WebGL Type 
----------  ----------
Int8Array   BYTE
Uint8Array  UNSIGNED_BYTE
Int16Array  SHORT
Uint16Array UNSIGNED_SHORT
Uint16Array UNSIGNED_SHORT_5_6_5
Uint16Array UNSIGNED_SHORT_5_5_5_1
Uint16Array UNSIGNED_SHORT_4_4_4_4
Int32Array  INT
Uint32Array UNSIGNED_INT
Uint32Array UNSIGNED_INT_5_9_9_9_REV
Uint32Array UNSIGNED_INT_2_10_10_10_REV
Uint32Array UNSIGNED_INT_10F_11F_11F_REV
Uint32Array UNSIGNED_INT_24_8
Uint16Array HALF_FLOAT
Float32Array    FLOAT

Я думаю, что

  • InternalFormat определяет, сколько памяти GPU используется для хранения текстуры
  • Format и Type определяет, как данные маршалируются в / из текстуры и javascript.
  • Type определяет, какой тип TypedArray должен использоваться
  • Format плюс параметры pixelStorei (раздел 6.10) определяют, сколько элементов понадобится TypedArray и какие элементы будут фактически использоваться (будут ли вещи плотно упакованы, будут ли дополнены некоторые строки и т. Д.)

Todo: Детали тренировки для

  • кодирование / декодирование некоторых более неясных Type значений в javascript и из него.
  • вычисление требований к размеру типизированного массива и информации о шагах с учетом Type, Format и pixelStorei параметров
...