OpenGl es 2.0 多纹理问题

OpenGl es 2.0 multitexture problems

我需要将两个纹理加载到着色器中,但是当应用程序启动时,第一个纹理正确显示,第二个只是一个黑色正方形

加载纹理

GLES20.glGenTextures(1, textures, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

激活纹理

GLES20.glEnableVertexAttribArray(ShaderProgram.posHandle);
GLES20.glEnableVertexAttribArray(ShaderProgram.texcordHandle);

GLES20.glVertexAttribPointer(ShaderProgram.posHandle,3, GLES20.GL_FLOAT, false, 0, vbuffer);
GLES20.glVertexAttribPointer(ShaderProgram.texcordHandle,2, GLES20.GL_FLOAT, false, 0, tbuffer);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture.getTexid());
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glUniform1i(ShaderProgram.texHandle, texture.getTexid());

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, blend.getTexid());
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glUniform1i(ShaderProgram.tex01Handle, blend.getTexid());

GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_BYTE, ibuffer);

片段着色器

precision mediump float;
uniform sampler2D tex;
uniform sampler2D tx;
uniform vec4 u_color;
uniform float alpha;
varying vec2 v_tex;
void main(){
    vec4 t = texture2D(tex, v_tex);
    vec4 te = texture2D(tx, v_tex);
    gl_FragColor = te;
}

First sampler2D tex

Second sampler2D tx

glBindTexture binds a texture to the specified target in the current texture unit. The current texture unit is a global state and is selected by glActiveTexture.
在绑定纹理之前,您必须 select 纹理。更改纹理单元对当前绑定的纹理没有影响:

# bind "texture" to texture unit 0
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture.getTexid());

# bind "blend" to texture unit 1
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);    
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, blend.getTexid());

此外,纹理对象和纹理采样器统一之间的绑定点是纹理单元。因此,纹理对象必须绑定到纹理单元,并且纹理单元的编号必须分配给纹理采样器统一(0 表示 GL_TEXTURE0,1 表示 GL_TEXTURE1)。例如:

GLES20.glUniform1i(ShaderProgram.texHandle, 0);   // 0 means GL_TEXTURE0
GLES20.glUniform1i(ShaderProgram.tex01Handle, 1); // 1 means GL_TEXTURE1