gles glsl有点明智的操作问题

时间:2018-03-19 22:39:45

标签: opengl-es glsl bitwise-operators

我正在尝试创建一个为移动应用程序使用按位命令的着色器。我使用的是glsl版本320 es。为了演示这个问题,我创建了一个shartrtoy示例: https://www.shadertoy.com/view/MsVyRw 哪个应该显示红色屏幕。从我的星系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 个答案:

答案 0 :(得分:1)

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

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