【问题标题】:gles glsl bit wise operations problemsgles glsl 位操作问题
【发布时间】:2018-03-21 18:18:20
【问题描述】:

我正在尝试为移动应用程序创建一个使用位命令的着色器。我正在使用 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。允许这种操作的预处理器标志是否缺少我的东西?

【问题讨论】:

    标签: opengl-es glsl bitwise-operators


    【解决方案1】:

    片段着色器的默认int 精度为mediump,因此我怀疑您存在精度问题(文字为 32 位精度,变量为 16 位精度)。请参阅着色器语言规范第 4.7.4 节。

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

    【讨论】:

    • 感谢您的回复。这实际上是问题的一半。所以我之前确实尝试过,但并没有解决问题。发生的事情是,当我执行 uint(....) >> x 时,分配的默认精度由于某种原因没有应用。但是当我首先将它分配给一个变量时,它按预期工作。实际上在大多数设备上 uint(...) >> x 导致崩溃,但我没有意识到这是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2011-01-27
    相关资源
    最近更新 更多