0

以下の簡略化された頂点シェーダーを 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);
}

デスクトップでは、両方がコンパイルされます。なぜそのように振る舞うのか理解できません。誰かがそれを説明できますか、それともシステム内のバグですか?

4

1 に答える 1

0

OpenGL ES の実装では、変数による配列のインデックス付けがサポートされていないようです ( v_lightDir[i] = ...)

于 2012-03-05T13:38:00.973 に答える