2013-04-17 5 views
1

Для устройства все мои шейдеры загружаются штрафом, кроме одного. Для этой шейдерной программы я получаю сообщение «Fragment program failed to compile with current context state», за которым следует аналогичная ошибка для вершинного шейдера при вызове glGetProgramInfoLog (...);iPad Opengl ES программа отлично работает на тренажере, но не на устройстве

Vertex шейдеров:

#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

Нет, это не так. Точный журнал: «Не удалось выполнить проверку: программа фрагмента не удалось скомпилировать с текущим контекстным состоянием. Ошибка проверки: программа Vertex не удалось скомпилировать с текущим контекстным состоянием». – 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); 

работает как хорошо.

Смежные вопросы