Как привязать текстуру только к одному объекту в OpenGLES?

Я активирую текстуру непосредственно перед объектом для рисования. Но текстура отображается на обоих объектах. Почему это так? Должен ли я отвязать текстуру перед первым отрисовываемым объектом? - Пробовал с 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;

}

person KOalaDelYtaPLaYa    schedule 12.01.2020    source источник


Ответы (1)


OpenGL — это механизм состояний. Как только состояние установлено, оно сохраняется до тех пор, пока оно не будет изменено снова, даже за рамками кадра.

Привяжите именованный объект текстуры перед вторым объектом и привяжите объект текстуры по умолчанию (0) после отрисовки второго объекта.
Кроме того, включите атрибуты вершин до вызова отрисовки и отключите их после:

Объект 1

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

GLES20.glEnableVertexAttribArray(aPositionLocation);
GLES20.glEnableVertexAttribArray(aColorLocation);

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);

GLES20.glDisableVertexAttribArray(aPositionLocation);
GLES20.glDisableVertexAttribArray(aColorLocation);

Объект 2:

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

GLES20.glEnableVertexAttribArray(aPositionLocation);
GLES20.glEnableVertexAttribArray(aTextureCoordinatesLocation);

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

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);

GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);

GLES20.glDisableVertexAttribArray(aPositionLocation);
GLES20.glDisableVertexAttribArray(aTextureCoordinatesLocation);

Программа sahder всегда считывает цвет текстуры:

void main() {

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

Обратите внимание, что первая строка, которая устанавливает gl_FragColor, бесполезна, потому что gl_FragColor перезаписывается в следующей строке.

Поскольку либо атрибут цвета не установлен (черный), либо цвет, считанный из текстуры, черный, цвета можно суммировать:

void main() {

    gl_FragColor = v_Color + texture2D(u_Texture, v_TextureCoordinates);
}
person Rabbid76    schedule 13.01.2020
comment
Спасибо за ответ. Я попытался с вашим ответом, но текстура все еще привязана к первому объекту. Даже после вызова disablingVertexAttribArray и привязки текстуры к объекту текстуры по умолчанию 0 после второго объекта рисования. Может быть, я делаю что-то не так с программой-шейдером. Посмотреть обновление - person KOalaDelYtaPLaYa; 13.01.2020
comment
спасибо за помощь, после редактирования шейдерной программы текстура больше не привязывается к первому объекту. Я отмечу это как принятый ответ. благодарю вас - person KOalaDelYtaPLaYa; 13.01.2020