【问题标题】:OpenGl es 2.0 multitexture problemsOpenGL es 2.0 多纹理问题
【发布时间】:2020-03-31 09:45:21
【问题描述】:

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

加载纹理

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

【问题讨论】:

    标签: java android android-studio opengl-es glsl


    【解决方案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 
    

    【讨论】:

    • 哇!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2012-04-08
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2012-04-08
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多