Android:纹理的 gl 状态与着色器的不匹配

标签 android opengl-es-2.0

在 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/

相关文章:

java - 使用 AndEngine 时的 onResumeGame() NullPointerException

java - 调用另一个 fragment 时 ListAdapter 错误

javascript - WebGL:优化每帧更改值和顶点计数的顶点缓冲区

android - 没有 GL_OES_packed_depth_stencil 的 OpenGL 帧缓冲区 android(在 Nexus 7 2012 上)

image-processing - 基于 GPU 的拉普拉斯金字塔

java - 使用不同级别的不同字符串填充 TextView

android - 在应用程序生命周期的什么时候可以/应该使用布局测量?

android - Gradle重复条目错误: META-INF/MANIFEST. MF(或如何从jar中删除文件)

java - 如何正确从视频内存加载/卸载纹理?

c++ - glColorMask 是否影响 glClear