在WebGL中,对texSubImage2D
和readPixels
的调用需要一个Format
和Type
参数。另外,texSubImage2D
需要一个InternalFormat
参数。虽然很容易找到有关这些参数的哪些组合有效的文档,但仍不清楚这些参数的含义以及如何有效地使用它们,尤其是考虑到某些内部格式可以与多种类型配对时,尤其如此。
R16F
/ HALF_FLOAT
vs R16F
/ FLOAT
或GL_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
,采用完全指定的方式。
WegGL2
和Format
参数主要与如何将数据编组到Type
中有关吗?例如,如果我使用ArrayBuffers
/ GL_R11F_G11F_B10F
这是否意味着我应该将GL_UNSIGNED_INT_10F_11F_11F_REV
和texSubImage2D
传递给数组的每个元素,并将它们的位仔细地缠绕在Uint32Array
中,而如果我使用javascript
/ GL_R11F_G11F_B10F
那么我应该使用一个Float
,其元素数量是前一种情况的三倍,而WebGL会为我处理一下纠结吗? WebGL是否尝试检查已通过的Float32Array
与我选择的TypedArray
/ Format
一致,还是直接在基础Type
上运行?我可以在最后一个实例中使用ArrayBuffer
吗?而对Float64Array
怎么办?
答案 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内存用于存储纹理Format
和Type
决定如何将数据编组到纹理和javascript中以及从中提取出来。 Type
确定必须使用哪种TypedArray Format
加上pixelStorei
参数(第6.10节)确定TypedArray需要多少个元素以及实际使用了哪些元素(将紧密包装,将某些行填充等)< / li>
Todo: 锻炼详情
Type
值进行编码/解码。Type
,Format
和pixelStorei
参数的情况下计算类型化的数组大小要求和步幅信息