如何从纹理格式属性 select WebGL GLSL 采样器类型?
How to select WebGL GLSL sampler type from texture format properties?
WebGL
的 GLSL
有 sampler2D
、isampler2D
和 usampler2D
用于读取 float
、int
、和 unsigned int
来自着色器内的纹理。在 WebGL1/2
中创建纹理时,我们指定纹理 InternalFormat
、Format
和 Type
。根据 OpenGL Sampler Wiki Page,对给定纹理使用具有不兼容类型的采样器会导致未定义的值。
是否有一个简单的规则来确定如何将纹理的 InternalFormat
、Format
和 Type
明确映射到正确的 GLSL 采样器类型?
(不失一般性,我专注于 ?sampler2D
但当然还有 3D、立方体等纹理,我假设它们遵循完全相同的规则)
WebGL1 没有这些不同的采样器类型。
WebGL2类型由内部格式指定。以 I
结尾的类型如 RGB8I
是 isampler
。以 UI
结尾的类型如 RGB8UI
是 usampler
格式。其他都是 sampler
有a list of the formats on page 5 of the WebGL2 Reference Guide
另请注意
(1) 您应该避免使用 WebGL2 的 OpenGL 参考页面,因为它们通常不匹配。相反,您应该阅读 OpenGL ES 3.0.x reference pages
(2) WebGL2 有更强的限制。您引用的文档说这些值可以是未定义的。 WebGL2 不允许这样做。来自 the WebGL2 spec
5.22 A sampler type must match the internal texture format
Texture lookup functions return values as floating point, unsigned integer or signed integer, depending on the sampler type passed to the lookup function. If the wrong sampler type is used for texture access, i.e., the sampler type does not match the texture internal format, the returned values are undefined in OpenGL ES Shading Language 3.00.6 (OpenGL ES Shading Language 3.00.6 §8.8). In WebGL, generates an INVALID_OPERATION error in the corresponding draw call, including drawArrays, drawElements, drawArraysInstanced, drawElementsInstanced , and drawRangeElements.
If the sampler type is floating point and the internal texture format is normalized integer, it is considered as a match and the returned values are converted to floating point in the range [0, 1].
WebGL
的 GLSL
有 sampler2D
、isampler2D
和 usampler2D
用于读取 float
、int
、和 unsigned int
来自着色器内的纹理。在 WebGL1/2
中创建纹理时,我们指定纹理 InternalFormat
、Format
和 Type
。根据 OpenGL Sampler Wiki Page,对给定纹理使用具有不兼容类型的采样器会导致未定义的值。
是否有一个简单的规则来确定如何将纹理的 InternalFormat
、Format
和 Type
明确映射到正确的 GLSL 采样器类型?
(不失一般性,我专注于 ?sampler2D
但当然还有 3D、立方体等纹理,我假设它们遵循完全相同的规则)
WebGL1 没有这些不同的采样器类型。
WebGL2类型由内部格式指定。以 I
结尾的类型如 RGB8I
是 isampler
。以 UI
结尾的类型如 RGB8UI
是 usampler
格式。其他都是 sampler
有a list of the formats on page 5 of the WebGL2 Reference Guide
另请注意
(1) 您应该避免使用 WebGL2 的 OpenGL 参考页面,因为它们通常不匹配。相反,您应该阅读 OpenGL ES 3.0.x reference pages
(2) WebGL2 有更强的限制。您引用的文档说这些值可以是未定义的。 WebGL2 不允许这样做。来自 the WebGL2 spec
5.22 A sampler type must match the internal texture format
Texture lookup functions return values as floating point, unsigned integer or signed integer, depending on the sampler type passed to the lookup function. If the wrong sampler type is used for texture access, i.e., the sampler type does not match the texture internal format, the returned values are undefined in OpenGL ES Shading Language 3.00.6 (OpenGL ES Shading Language 3.00.6 §8.8). In WebGL, generates an INVALID_OPERATION error in the corresponding draw call, including drawArrays, drawElements, drawArraysInstanced, drawElementsInstanced , and drawRangeElements.
If the sampler type is floating point and the internal texture format is normalized integer, it is considered as a match and the returned values are converted to floating point in the range [0, 1].