如何从纹理格式属性中选择WebGL GLSL采样器类型?

lil*_*njn 0 webgl webgl2

WebGL具有、、 和用于从着色器内部的纹理读取、GLSL、和。创建纹理时,我们指定纹理、和。根据OpenGL Sampler Wiki Page,对于给定纹理使用类型不兼容的采样器可能会导致未定义的值。 sampler2Disampler2Dusampler2Dfloatintunsigned intWebGL1/2InternalFormatFormatType

是否有一个简单的规则来确定如何将纹理的InternalFormatFormatType明确映射到正确的 GLSL 采样器类型?

(不失一般性,我重点关注了,?sampler2D 但当然也有 3D、立方体等纹理,我假设它们遵循完全相同的规则)

gma*_*man 6

WebGL1 没有这些不同的采样器类型。

\n\n

WebGL2的类型是由内部格式指定的。I以like结尾的类型RGB8Iisampler. UI以like结尾的类型RGB8UIusampler格式。其他一切都是sampler

\n\n

WebGL2 参考指南第 5 页上有格式列表

\n\n

另请注意

\n\n

(1) 您应该避免使用 WebGL2 的 OpenGL 参考页面,因为它们通常不匹配。相反,您应该阅读OpenGL ES 3.0.x 参考页

\n\n

(2)WebGL2有更强的限制。您引用的文档表示这些值可以是未定义的。WebGL2 不允许这样做。来自WebGL2规范

\n\n
\n

5.22 采样器类型必须与内部纹理格式匹配

\n\n

纹理查找函数返回浮点、无符号整数或有符号整数形式的值,具体取决于传递给查找函数的采样器类型。如果纹理访问使用了错误的采样器类型,即采样器类型与纹理内部格式不匹配,则返回值在 OpenGL ES Shading Language 3.00.6 中未定义(OpenGL ES Shading Language 3.00.6 \xc2\xa78.6)。 8). 在 WebGL 中,在相应的绘制调用中生成 INVALID_OPERATION 错误,包括drawArrays、drawElements、drawArraysInstanced、drawElementsInstanced 和drawRangeElements。

\n\n

如果采样器类型为浮点型且内部纹理格式为归一化整数,则视为匹配,并将返回值转换为 [0, 1] 范围内的浮点型。

\n
\n