【发布时间】:2019-09-13 22:30:20
【问题描述】:
在 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/@987654336pp) >
此外,这两个 API 调用都可以与 pixels 参数结合使用,该参数可以是 TypedArray - 在这种情况下,不清楚 TypedArray 的哪些选择对于给定的 InternalFormat/ 有效/ Format/Type 组合(以及哪个选择在避免强制转换方面是最佳的)
例如,GPU 使用的每个 texel 的内部内存是否真的完全由 InternalFormat 决定——要么以依赖于实现的方式(例如 WebGL1 unsized 格式),要么对于一些新的在WegGL2 中添加了InternalFormats,这是一种完全指定的方式。
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怎么办?
【问题讨论】: