我正在尝试创建一个为移动应用程序使用按位命令的着色器。我使用的是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一起使用。是否有一些我在预处理器标志中缺少的东西会允许这种操作?
答案 0 :(得分:1)
片段着色器的默认int
精度为mediump
,所以我怀疑你有精度问题(32位精度的文字和16位精度的变量)。请参见着色器语言规范部分4.7.4。
尝试将precision highp int;
与其他默认精度语句一起添加到着色器的开头。