我需要将两个纹理加载到着色器中,但是当应用程序启动时,第一个纹理正确显示,第二个只是黑色正方形
加载纹理
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;
}
答案 0 :(得分:1)
glBindTexture
将纹理绑定到当前纹理单元中的指定目标。当前纹理单位是全局状态,由glActiveTexture
选择。
绑定纹理之前,必须先选择纹理。更改纹理单位不会影响当前绑定的纹理:
# 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());
此外,纹理对象和纹理采样器统一之间的绑定点是纹理单位。因此,纹理对象必须绑定到纹理单元,并且纹理单元的编号必须分配给均匀的纹理采样器(GL_TEXTURE0
为0,GL_TEXTURE1
为1)。例如:
GLES20.glUniform1i(ShaderProgram.texHandle, 0); // 0 means GL_TEXTURE0
GLES20.glUniform1i(ShaderProgram.tex01Handle, 1); // 1 means GL_TEXTURE1