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;
}
Androidのデモコードでもこれが表示されるため、無視できるものであることがわかりました。コードをコメントアウトした後(そしていくつかの他の強力なデバッグ)、うまくいきました。 – leech
これはどのようなテクスチャ形式ですか? Tegraは、テクスチャが標準の8ビット形式ではないことをコンパイラに通知するためにシェーダに#pragmaを要求することがあります。同じことがブレンドで行われます。 NVIDIAはそれほど厳格ではありませんでした。 –
私はライブラリのほとんどを残していますので、私はこの答えがあなたが探していたことを願っています:RGBA、私は各チャンネルが8ビットだと思います。私はそれをチェックし、私の前提が正しいかどうかを見ます。 – leech