【问题标题】:How to select WebGL GLSL sampler type from texture format properties?如何从纹理格式属性中选择 WebGL GLSL 采样器类型?
【发布时间】:2019-04-23 01:17:46
【问题描述】:

WebGLGLSL 具有sampler2Disampler2Dusampler2D,用于从着色器中的纹理读取floatintunsigned int。在WebGL1/2 中创建纹理时,我们指定纹理InternalFormatFormatType。根据OpenGL Sampler Wiki Page,对给定纹理使用类型不兼容的采样器可能会导致未定义的值。

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

(不失一般性,我专注于?sampler2D,当然也有 3D、Cube 等纹理,我假设它们遵循完全相同的规则)

【问题讨论】:

    标签: webgl webgl2


    【解决方案1】:

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

    WebGL2 的类型由内部格式指定。以I 结尾的类型如RGB8Iisampler。以UI 结尾的类型如RGB8UIusampler 格式。其他都是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 采样器类型必须匹配内部纹理格式

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

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

    【讨论】:

    • 谢谢——我的大部分困惑来自于认为 isampler 和 usampler 在 webgl 1.0 中可用,并试图弄清楚它在那种情况下是如何工作的。有一个小错字:“值已定义”应该是“值未定义”,但不允许编辑少于 6 个字符...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2022-01-17
    • 2011-11-14
    • 1970-01-01
    • 2013-05-30
    • 2018-03-11
    相关资源
    最近更新 更多