OpenGL ES 顶点着色器无法使用函数进行编译



当我尝试在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);
}

在桌面上,两者都进行编译。我不明白它为什么会这样。有人能解释一下吗?或者这是系统内部的错误吗?

您的OpenGL ES实现似乎不支持通过变量(v_lightDir[i] = ...)进行数组索引

最新更新