2013-04-17 108 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); 

也適用。

相關問題