2013-04-17 37 views
1

对于该设备,我的所有着色器都可以正常加载,除了一个之外。对于这个着色器程序,当我调用glGetProgramInfoLog(...)时,出现“片段程序无法编译当前上下文状态”的错误,接着出现类似的顶点着色器错误;iPad Opengl ES程序在模拟器上工作正常,但不是设备

顶点着色器:

#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(shader,GL_COMPILE_STATUS,&结果)链接程序时,我检查了每个着色器的编译状态,并且它们都检出正常。有任何想法吗?

+0

通常,信息日志会为您提供发生错误的确切位置。它是否提供了特定的行号? – user1118321

+0

不,它不。确切的日志是:“验证失败:片段程序无法编译当前上下文状态 验证失败:顶点程序无法编译当前上下文状态。 – AbleArcher

+0

另外,当我使用glGetShaderiv(theShader,GL_COMPILE_STATUS,&result)链接程序时,我检查了每个着色器的编译状态,并且它们都检查出正常。 (编辑问题以反映这一事实)。 – AbleArcher

回答

1

更改在片段着色器的线

gl_FragColor = vec4((color + specularCoefficient*MaterialSpecular).rgb, 1.0); 

gl_FragColor = vec4((1.0*color + specularCoefficient*MaterialSpecular).rgb, 1.0); 

修复该问题。我怀疑它与精确度有关的变化变量颜色,以重新排序行

gl_FragColor = vec4((MaterialSpecular + specularCoefficient*color).rgb, 1.0); 

也适用。

相关问题