Вершинный шейдер OpenGL ES не будет компилироваться с функцией - PullRequest
0 голосов
/ 05 марта 2012

Когда я пытаюсь скомпилировать упрощенный вершинный шейдер, представленный ниже, на Galaxy S (PowerVR SGX540, Android), он не компилируется, и ошибки не выдается. Просто "Компиляция не удалась". находится в журнале.

#ifdef GL_ES
   precision mediump float;
   precision lowp int;
#endif

uniform mat4 u_m;   //model 
uniform mat4 u_mvp; //model view projection
uniform vec3 u_lightPos[1];

uniform int u_lightCount;

attribute vec3 a_position;

varying vec3 v_lightDir[1];

void pointLight(int i, vec3 vertPos){
    v_lightDir[i] = u_lightPos[i] - vertPos;
}

void main( void )
{   
    vec3 vertPos = (u_m * vec4(a_position, 1.0)).xyz;

    if(u_lightCount > 0){
        pointLight(0, vertPos);
    }

    gl_Position = u_mvp * vec4(a_position, 1.0);
}

Однако, когда я перемещаю функциональный блок в основную функцию, он прекрасно компилируется:

#ifdef GL_ES
   precision mediump float;
   precision lowp int;
#endif

uniform mat4 u_m;   //model 
uniform mat4 u_mvp; //model view projection
uniform vec3 u_lightPos[1];

uniform int u_lightCount;

attribute vec3 a_position;

varying vec3 v_lightDir[1];

void main( void )
{   
    vec3 vertPos = (u_m * vec4(a_position, 1.0)).xyz;

    if(u_lightCount > 0){
        v_lightDir[0] = u_lightPos[0] - vertPos;
    }

    gl_Position = u_mvp * vec4(a_position, 1.0);
}

На рабочем столе оба компилируются. Я не могу понять, почему так себя ведет. Может кто-нибудь объяснить это или это ошибка внутри системы?

1 Ответ

0 голосов
/ 05 марта 2012

Кажется, что ваша реализация OpenGL ES не поддерживает индексирование массива по переменной (v_lightDir[i] = ...)

...