我的这款着色器与我的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;
是什么导致了这个问题?
答案 0 :(得分: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
指令并更新in
和out
,您应该收到相同的错误。
编辑:如果您想要统一资源而不将桌面内容更新为更高版本的GLSL,则#ifdef
可GL_ES
。