iPad Opengl ES程序在模拟器上工作正常,但不是设备
对于该设备,除了一个之外,我的所有着色器都可以正常加载。 对于这个着色器程序,当我调用glGetProgramInfoLog(…)时,得到“片段程序无法编译当前上下文状态”的错误,接着出现类似的顶点着色器错误。
顶点着色器:
#version 100 uniform mat4 Projection; uniform mat4 Modelview; uniform mat4 Rotation; uniform vec3 Translation; uniform vec4 LightDirection; uniform vec4 MaterialDiffuse; uniform float MaterialShininess; attribute vec3 position; attribute vec3 normal; varying vec4 color; varying float specularCoefficient; void main() { vec3 _normal = normalize(mat3(Modelview[0].xyz, Modelview[1].xyz, Modelview[2].xyz)*normal); // There is an easier way to do the above using typecast, but is apparently broken float NdotL = dot(-_normal, normalize(vec3(LightDirection))); if(NdotL < 0.0){ NdotL = 0.0; } color = NdotL * MaterialDiffuse; float NdotO = dot(-_normal, vec3(0.0, 0.0, -1.0)); if(NdotO < 0.0){ NdotO = 0.0; } specularCoefficient = pow(NdotO, MaterialShininess); vec3 p = position + Translation; gl_Position = Projection*Modelview*vec4(p, 1.0); }
片段着色器:
#version 100 precision mediump float; varying vec4 color; varying float specularCoefficient; uniform vec4 MaterialSpecular; void main(){ gl_FragColor = vec4((color + specularCoefficient*MaterialSpecular).rgb, 1.0); }
我不知道发生了什么事情,特别是因为我有一个类似的程序,正如上面添加纹理坐标。 另外,当我使用glGetShaderiv(theShader,GL_COMPILE_STATUS,&result)链接程序时,我检查了每个着色器的编译状态,并且它们全部检出正常。 有任何想法吗?
改变线
gl_FragColor = vec4((color + specularCoefficient*MaterialSpecular).rgb, 1.0);
在片段着色器中
gl_FragColor = vec4((1.0*color + specularCoefficient*MaterialSpecular).rgb, 1.0);
修复了这个问题。 我怀疑它与精确度有关的变化的颜色,以重新sorting行
gl_FragColor = vec4((MaterialSpecular + specularCoefficient*color).rgb, 1.0);
也适用。