OpenGL ES'<<'不适用于' int'和' int'

时间:2014-08-19 02:10:39

标签: opengl-es shader bitwise-operators

我的这款着色器与我的Mac应用程序完美配合。但是现在我正在尝试制作iOS版本的应用程序,我得到一个奇怪的错误。以下是片段着色器的一部分:

uniform sampler2D image;
varying lowp vec2 fragTex;

 int LFSR_Rand_Gen(in int n)
{
n = (n << 13) ^ n;
return (n * (n*n*15731+789221) + 1376312589) & 0x7fffffff;
}

float LFSR_Rand_Gen_f(in int n )
{
    return float(LFSR_Rand_Gen(n));
}

float noise3f(in vec3 p)
{
ivec3 ip = ivec3(floor(p));
vec3 u = fract(p);
u = u*u*(3.0-2.0*u);

int n = ip.x + ip.y*57 + ip.z*113;

float res = mix(mix(mix(LFSR_Rand_Gen_f(n+(0+57*0+113*0)),
                        LFSR_Rand_Gen_f(n+(1+57*0+113*0)),u.x),
                    mix(LFSR_Rand_Gen_f(n+(0+57*1+113*0)),
                        LFSR_Rand_Gen_f(n+(1+57*1+113*0)),u.x),u.y),
                mix(mix(LFSR_Rand_Gen_f(n+(0+57*0+113*1)),
                        LFSR_Rand_Gen_f(n+(1+57*0+113*1)),u.x),
                    mix(LFSR_Rand_Gen_f(n+(0+57*1+113*1)),
                        LFSR_Rand_Gen_f(n+(1+57*1+113*1)),u.x),u.y),u.z);

     return 1.0 - res*(1.0/1073741824.0);
}


void main()
{

// calculations
gl_FragColor = fragTex;

}

无论我使用的是OpenGL ES 2.0还是3.0,我都会遇到同样的错误:

&#39;&LT;&LT;&#39;不适用于&#39; int&#39;和&#39; int&#39;

&#39;&安培;&#39;不适用于&#39; int&#39;和&#39; int&#39;

是什么导致了这个问题?

1 个答案:

答案 0 :(得分:3)

仅从版本3开始,

<<&出现在GLSL ES中。您需要添加显式请求以编译为GLSL 3.00:

#version 300 es

然后你又遇到了一堆其他问题。与桌面不同,ES并不是维护传统功能所困扰的。因此,您需要varying成为in / out并且gl_FragColor不再存在。您需要为自己声明一个合适的out,因为gl_FragColor前缀是保留的,因此可能不会被称为gl_。这些更改遵循桌面上的更改。

所以,例如让Xcode创建其标准GL ES模板。它对测试很有帮助,因为红色立方体应该总是出现(它的着色器来自GLKit);仅当自定义提供的着色器编译时,蓝色立方体才可见。

将API更改为kEAGLRenderingAPIOpenGLES3(Xcode当前发货版本中视图控制器的第105行;我未使用测试版)。然后将着色器更改为:

#version 300 es

in vec4 position;
in vec3 normal;

out lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    int a, b, c;
    c = a & b;

    // template stuff follows
    vec3 eyeNormal = normalize(normalMatrix * normal);
    vec3 lightPosition = vec3(0.0, 0.0, 1.0);
    vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0);

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));

    colorVarying = diffuseColor * nDotVP;

    gl_Position = modelViewProjectionMatrix * position;
}

#version 300 es

in lowp vec4 colorVarying;

out lowp vec4 my_FragColor;

void main()
{
    my_FragColor = colorVarying;
}

...你应该得到一个干净的构建。相反,只需尝试复制和粘贴:

    int a, b, c;
    c = a & b;

...没有添加#version指令并更新inout,您应该收到相同的错误。

编辑:如果您想要统一资源而不将桌面内容更新为更高版本的GLSL,则#ifdefGL_ES