GLSL | 'float'和'int'之间的算术运算中输入不匹配

CAM*_*BAP 4 glsl android-ndk opengl-es-2.0

我试图编译程序(我以前从Cg语言中移植它).片段着色器是

precision mediump float;
precision mediump int;

uniform float time;
uniform float aspect;
uniform sampler2D sampler_main;

varying vec4 v_texCoord;

void main()
{
    vec3 ret;
    vec2 uv = v_texCoord.xy;

    float rad=sqrt((uv.x-0.5)*(uv.x-0.5)*4.0+(uv.y-0.5)*(uv.y-0.5)*4.0)*.7071067;
    float ang=atan(((uv.y-0.5)*2.0),((uv.x-0.5)*2.0));

    vec2 uv1 = (uv-0.5)*aspect.xy;

    float rad1 = .1/(length(uv1) + .1)) ;

    vec2 uv2 = vec2 (ang/3.14, rad1);
    uv2.y = uv2.y  +0.1*time;
    uv2.x = uv2.x  +.0*time;

    vec2 uv3 = vec2 (ang/3.14, rad1*1.5);
    uv3.y = uv3.y + 0.08*time ;
    uv3.x = uv3.x + time/32;

    vec3 crisp = 2*texture2D(sampler_main, uv2).xyz;
    vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1-rad,8);
    crisp = 3*crisp * pow(rad,1);
    float mask = saturate(1-4*rad);
    ret = crisp + lay1*mask + mask * texture2D(sampler_main, uv).xyz;

    gl_FragColor.xyz = ret;
    gl_FragColor.w = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

我在网上得到了错误

uv3.x = uv3.x + time/32;
Run Code Online (Sandbox Code Playgroud)

当我改为

uv3.x = uv3.x + time/32.0;
Run Code Online (Sandbox Code Playgroud)

问题解决了,但我不明白问题的根源.

这条线的问题一样

float mask = saturate(1-4*rad);                  => float mask = saturate(1.0-4.0*rad);
vec3 crisp = 2*texture2D(sampler_main, uv2).xyz; => vec3 crisp = 2.0*texture2D(sampler_main, uv2).xyz;
vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1-rad,8);      => vec3 lay1 = vec3 (0,0,1)*uv.y*pow(1.0-rad,8.0); 
crisp = 3*crisp * pow(rad,1);                    => crisp = 3.0*crisp * pow(rad,1.0);
Run Code Online (Sandbox Code Playgroud)

有人能解释一下:

  1. 为什么我不能在同一个表达式中混合float和int常量?
  2. 是否有任何解决方法允许我混合float和int常量?

Uni*_*rsE 7

早期GLSL不允许隐式演员表演.所以尝试一个明确的演员:

uv3.x = uv3.x + time/float(32);
Run Code Online (Sandbox Code Playgroud)

GLSL 1.1规格说,在第4章(第16页):

OpenGL着色语言是类型安全的.类型之间没有隐式转换

最近的GLSL允许隐式类型转换.该GLSL 4.4规格说,在第4章(第25页):

OpenGL着色语言是类型安全的.类型之间存在一些隐式转换.具体如何以及何时发生这种情况将在4.1.10"隐式转换"一节中描述,并在本说明书的其他章节中引用.

稍后从第39页开始,有一个可能的隐式转换列表.