在 Android 设备上验证我的着色器时出现奇怪的错误。 (这是运行 Android 3.1 的 Asus eee Pad)
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;
}
这是 fragment 着色器:
#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;
}
最佳答案
我的 Tegra3 设备无法通过 glValidateProgram()。 就像上面评论中提到的'the swine',没有绑定(bind)的纹理会导致这种情况。
因此,我通过在使用 glActiveTexture() 和 glBindTexture() 设置纹理后仅调用 glValidateProgram() 来修复我的验证错误。
不过,我的配备 Mali GPU 的设备从来没有遇到过这个问题,所以它可能只是 Tegra 的问题。
关于Android:纹理的 gl 状态与着色器的不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801832/