Android ndk 与x27之间的算术运算中GLSL |类型不匹配;浮动';和';int';

Android ndk 与x27之间的算术运算中GLSL |类型不匹配;浮动';和';int';,android-ndk,glsl,opengl-es-2.0,Android Ndk,Glsl,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

我试图编译程序(我以前从
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;
}
我在网上出错了

uv3.x = uv3.x + time/32;
当我把它改成

uv3.x = uv3.x + time/32.0;
问题解决了,但我不明白问题的根源

这条线也有同样的问题

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);
谁能解释一下:

  • 为什么我不能在同一个表达式中混合float和int常量
  • 有没有什么解决方法可以让我混合使用float和int常量

  • 早期GLSL中不允许隐式强制转换。因此,请尝试显式转换:

    uv3.x = uv3.x + time/float(32);
    
    第4章(第16页)中提到:

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

    最近的GLSL允许隐式类型转换。第4章(第25页)中规定:

    OpenGL着色语言是类型安全的。类型之间存在一些隐式转换。 第4.1.10节“隐式转换”中描述了这种情况的具体发生方式和时间,如下所示: 本规范其他章节中引用


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

    因为你的问题有标签,所以相关的规范就是相应的规范

    第5.8节“作业”(第46页)中说:

    左值表达式和右值表达式必须具有相同的类型。所有需要的类型转换必须通过构造函数显式指定

    在第5.9节“表达”(第48页)中:

    算术二进制运算符add(+)、subtract(-)、multiply(*)和divide(/)对整型和浮点型表达式(包括向量和矩阵)进行操作。两个操作数必须是相同的类型,或者一个可以是标量浮点,另一个可以是浮点向量或矩阵,或者一个可以是标量整数,另一个可以是整数向量

    您所需要做的就是在浮点表达式中使用浮点常量。在第一个示例中,使用
    32.0
    而不是
    32
    。微妙的细节,如果您习惯于从C/C++编写
    32.0f
    :ES 2.0的GLSL版本不支持
    f
    后缀。因此,写入
    32.0f
    是一个错误。这在ES 3.0中是允许的


    虽然我确信有些人会强烈反对我的观点:但我认为不支持这些自动类型转换是一个很好的特性。我相信,在不依赖自动转换的情况下,始终了解您正在操作的类型并使用正确的类型是很有用的。类型安全是有价值的,而C语言和C++语言中的松散类型是错误的常见来源。

    + 1,如果你能提供一些文档,我会接受你的答案。你不需要零点;小数点本身工作正常。