Opengl es 如何将纹理仅绑定到OpenGLES中的一个对象?

Opengl es 如何将纹理仅绑定到OpenGLES中的一个对象?,opengl-es,glsl,shader,textures,gldrawarrays,Opengl Es,Glsl,Shader,Textures,Gldrawarrays,我正在激活要绘制的对象之前的纹理。但纹理会显示在两个对象上。为什么会这样?我应该在第一个要绘制的对象之前解除纹理绑定吗?-我尝试使用glDisable和glBindTexture,但没有效果。 这是我的代码: @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT); synchronized (camerObject) { surfaceTextu

我正在激活要绘制的对象之前的纹理。但纹理会显示在两个对象上。为什么会这样?我应该在第一个要绘制的对象之前解除纹理绑定吗?-我尝试使用glDisable和glBindTexture,但没有效果。 这是我的代码:

@Override
public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT);

    synchronized (camerObject) {
        surfaceTextureCamera.updateTexImage();
        cameraUpdate = false;
    }

    vertexBuffer.position(0);
    GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
    GLES20.glEnableVertexAttribArray(aPositionLocation);

    vertexBuffer.position(POSITION_COMPONENT_COUNT);
    GLES20.glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
    GLES20.glEnableVertexAttribArray(aColorLocation);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);


    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]);

    GLES20.glUniform1i(textureUnitLocation, 0);

    vertexBuffer2.position(0);
    GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDETEXTURE, vertexBuffer2);
    GLES20.glEnableVertexAttribArray(aPositionLocation);

    vertexBuffer2.position(TEXTURE_COMPONENT_COUNT);
    GLES20.glVertexAttribPointer(aTextureCoordinatesLocation, TEXTURE_COMPONENT_COUNT, GLES20.GL_FLOAT, false, STRIDETEXTURE, vertexBuffer2);
    GLES20.glEnableVertexAttribArray(aTextureCoordinatesLocation);


    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);
更新 这是我的着色器程序:

    #extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;
varying vec2 v_TextureCoordinates;
varying vec4 v_Color;

void main() {

gl_FragColor = v_Color;
gl_FragColor = texture2D(u_Texture, v_TextureCoordinates);
}

attribute vec4 a_Position;
attribute vec4 a_Color;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
varying vec4 v_Color;

void main() {

    v_Color = a_Color;
    v_TextureCoordinates = a_TextureCoordinates;
     gl_Position = a_Position;

}

OpenGL是一个状态引擎。一旦设置了状态,它将一直保持,直到再次更改,甚至超出帧

在第二个对象之前绑定命名纹理对象,并在绘制第二个对象之后绑定默认纹理对象(0)。
此外,在绘制调用之前启用顶点属性,并在以下操作之后禁用:

对象1

vertexBuffer.position(0);
GLES20.glVertexAttribute指针(位置位置、位置分量计数、GLES20.GL浮点、false、步幅、顶点缓冲区);
vertexBuffer.position(位置分量计数);
GLES20.glvertexattributepointer(颜色位置、颜色分量计数、GLES20.GL浮动、假、步幅、顶点缓冲区);
GLES20.GlenableVertexattributeArray(定位);
GLES20.GlenableVertexAttributeArray(A色定位);
GLES20.GlDrawArray(GLES20.GL_三角形_扇,0,6);
GLES20.GLDisableVertexAttributeArray(位置定位);
GLES20.GLDisableVertexAttributeArray(颜色定位);
目标2:

vertexBuffer2.位置(0);
GLES20.glVertexAttributePointer(位置位置、位置分量计数、GLES20.GL浮动、false、StripTexture、vertexBuffer2);
vertexBuffer2.位置(纹理分量计数);
GLES20.glVertexAttributePointer(ATextureCoordinationsLocation,TEXTURE_COMPONENT_COUNT,GLES20.GL_FLOAT,false,StrativeTexture,vertexBuffer2);
GLES20.GlenableVertexattributeArray(定位);
GLES20.GlenableVertexAttributeArray(ATExtractionsLocation);
GLES20.glUniform1i(结构硝化,0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,纹理[0]);
GLES20.GlDrawArray(GLES20.GL_三角形_扇,0,6);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES,0);
GLES20.GLDisableVertexAttributeArray(位置定位);
GLES20.GLDisableVertexAttributeArray(ATextureCoordinationsLocation);

sahder程序始终从纹理读取颜色:

void main(){
gl_FragColor=v_颜色;
gl_FragColor=纹理2D(u_纹理,v_纹理坐标);
}
注意,设置
gl\u FragColor
的第一行是无用的,因为
gl\u FragColor
在下一行中被覆盖

由于未设置颜色属性(黑色)或从纹理读取的颜色为黑色,因此可以对颜色求和:

void main(){
gl_FragColor=v_颜色+纹理2D(u_纹理,v_纹理坐标);
}

谢谢你的回答。我尝试了你的答案,但纹理仍然绑定到第一个对象。甚至在调用DisableVertexAttributeArray并将纹理绑定到第二个绘制对象之后的默认纹理对象0之后。也许我的着色器程序有问题。有关帮助,请参见UpdateAnks,编辑着色器程序后,纹理不再绑定到第一个对象。我将把它作为一个公认的答案。非常感谢。