2011-07-23 8 views
3

アンドロイドデバイスでシェーダの妥当性を確認する際に奇妙なエラーが発生しました。 (Android 3.1搭載のAsus eee Pad)Android:テクスチャのgl状態とシェーダの一致がありません

Texture's gl states do not match with shader's

このエラーを解決する方法はありますか?ここ

はエラーを生成するコードである:ここ

GLES20.glValidateProgram(id); 
GLES20.glGetProgramiv(id, GLES20.GL_VALIDATE_STATUS, ShaderStatus, 0); 

if (ShaderStatus[0] != GLES20.GL_TRUE) { 
    String glerror = GLES20.glGetProgramInfoLog(id); 
    throw new Error("ERROR TIME! failed to validate GLSL program"); 
} 

が頂点シェーダである:ここ

#ifdef GL_ES 
precision highp float; 
#endif 

attribute vec3 Position; 
attribute vec2 TexCoord; 

uniform mat4 Projection; 
uniform vec3 Location; 
uniform float Angle; 
uniform vec3 Scale; 
uniform sampler2D Texture; 

varying vec2 vTexCoord; 

void main(void) { 
    mat3 RotationMatrix = mat3(cos(-Angle), -sin(-Angle), 0.0, 
           sin(-Angle), cos(-Angle), 0.0, 
           0.0,   0.0,    1.0); 

    gl_Position = Projection * vec4(RotationMatrix * (Position*Scale) + Location, 1.0); 
    //vColor = vec4(1.0, 1.0, 1.0, 1.0); 
    vTexCoord = TexCoord; 
} 

は、フラグメントシェーダである:

マイTegra3デバイスが失敗する
#ifdef GL_ES 
precision highp float; 
#endif 

uniform sampler2D Texture; 
varying vec2 vTexCoord; 
uniform vec4 Color; 

void main(void) { 
    vec4 color = texture2D(Texture, vTexCoord) * Color; 
    gl_FragColor = color; 
} 
+0

Androidのデモコードでもこれが表示されるため、無視できるものであることがわかりました。コードをコメントアウトした後(そしていくつかの他の強力なデバッグ)、うまくいきました。 – leech

+0

これはどのようなテクスチャ形式ですか? Tegraは、テクスチャが標準の8ビット形式ではないことをコンパイラに通知するためにシェーダに#pragmaを要求することがあります。同じことがブレンドで行われます。 NVIDIAはそれほど厳格ではありませんでした。 –

+0

私はライブラリのほとんどを残していますので、私はこの答えがあなたが探していたことを願っています:RGBA、私は各チャンネルが8ビットだと思います。私はそれをチェックし、私の前提が正しいかどうかを見ます。 – leech

答えて

0

glValidateProgram()。 上記のコメントに記載されている「豚」のように、拘束されていないテクスチャが原因です。

だから私は、テクスチャがglActiveTexture()とglBindTexture()で設定された後にのみglValidateProgram()を呼び出すことによって、私の検証エラーを修正。

マリGPUを搭載したデバイスでは、この問題は一度も発生しませんでした。そのため、Tegraの問題のみになります。

関連する問題