WebGL纹理的InternalFormat,Format和Type参数的含义和含义

时间:2019-04-24 15:04:44

标签: webgl webgl2

在WebGL中,对texSubImage2DreadPixels的调用需要一个FormatType参数。另外,texSubImage2D需要一个InternalFormat参数。虽然很容易找到有关这些参数的哪些组合有效的文档,但仍不清楚这些参数的含义以及如何有效地使用它们,尤其是考虑到某些内部格式可以与多种类型配对时,尤其如此。 R16F / HALF_FLOAT vs R16F / FLOATGL_R11F_G11F_B10F / FLOAT vs GL_R11F_G11F_B10F / GL_UNSIGNED_INT_10F_11F_11F_REV(其中我使用的符号是InternalFormat / Type

这两个API调用都可以与可以为pixels的{​​{1}}参数结合使用-在这种情况下,尚不清楚TypedArray的哪些选择对给定的TypedArray / InternalFormat / Format组合(并且在避免强制转换方面,哪种选择是最佳选择)

例如,是否确实由Type决定了每个texel GPU使用的内部存储器-是否采用与实现相关的方式(例如InternalFormat WebGL1格式),或者对于unsized中一些新添加的InternalFormat,采用完全指定的方式。

WegGL2Format参数主要与如何将数据编组到Type中有关吗?例如,如果我使用ArrayBuffers / GL_R11F_G11F_B10F 这是否意味着我应该将GL_UNSIGNED_INT_10F_11F_11F_REVtexSubImage2D传递给数组的每个元素,并将它们的位仔细地缠绕在Uint32Array中,而如果我使用javascript / GL_R11F_G11F_B10F那么我应该使用一个Float,其元素数量是前一种情况的三倍,而WebGL会为我处理一下纠结吗? WebGL是否尝试检查已通过的Float32Array与我选择的TypedArray / Format一致,还是直接在基础Type上运行?我可以在最后一个实例中使用ArrayBuffer吗?而对Float64Array怎么办?

1 个答案:

答案 0 :(得分:0)

通过参考WebGL2 Spec的第3.7.6节“纹理对象”,似乎可以解决大部分问题。特别是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内存用于存储纹理
  • FormatType决定如何将数据编组到纹理和javascript中以及从中提取出来。
  • Type确定必须使用哪种TypedArray
  • Format加上pixelStorei参数(第6.10节)确定TypedArray需要多少个元素以及实际使用了哪些元素(将紧密包装,将某些行填充等)< / li>

Todo: 锻炼详情

  • 在JavaScript中对一些更晦涩的Type值进行编码/解码。
  • 在给定TypeFormatpixelStorei参数的情况下计算类型化的数组大小要求和步幅信息