代码之家  ›  专栏  ›  技术社区  ›  Luple

gles glsl逐位操作问题

  •  1
  • Luple  · 技术社区  · 6 年前

    我正在尝试为移动应用程序创建一个使用逐位命令的着色器。我使用的是glsl版本320 es。为了演示该问题,我创建了一个shadertoy示例: https://www.shadertoy.com/view/MsVyRw 应显示红色屏幕。从我的galaxy s8打开时,屏幕也会显示红色。使用以下片段着色器运行应用程序时:

    #version 320 es
    precision highp float;
    out vec4 fragColor;
    void main()
    {
        uint x = uint(0xec140e57);
        uint tmp0 = x >> uint(4);
        uint tmp1 = uint(0xec140e57) >> uint(4);
        if(tmp0 == tmp1){
            fragColor = vec4(1.0, 0.0, 0.0,1.0);
        }
        else{
            fragColor = vec4(0.0, 0.0, 1.0,1.0);
        }
    };
    

    屏幕显示为蓝色。但是如果我改变

    uint x = uint(0xec140e57);
    uint tmp0 = x >> uint(4);
    uint tmp1 = uint(0xec140e57) >> uint(4);
    

    uint tmp0 = uint(0xec140e57) >> uint(4);
    uint tmp1 = uint(0xec140e57) >> uint(4);
    

    屏幕显示为红色。

    这绝对不是gpu ALU的问题,因为它与shadertoy一起工作。我是否缺少允许这种操作的预处理器标志?

    1 回复  |  直到 6 年前
        1
  •  1
  •   solidpixel    6 年前

    片段着色器具有默认值 int 精度 mediump ,所以我怀疑您有精度问题(32位精度的文字和16位精度的变量)。请参见着色器语言规范第4.7.4节。

    尝试添加 precision highp int; 到着色器的开头以及其他默认精度语句。