Как настроить фрагментный шейдер для нескольких текстур на нескольких объектах в OpenGLES? - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь привязать текстуру к одному объекту и другую текстуру к следующему объекту. Я задал здесь в stackoverflow почти тот же вопрос, но разница в то время заключалась в том, что у меня была только одна текстура и несколько объектов. Как связать текстуру только с одним объектом в OpenGLES? Это работало для одной текстуры и нескольких объектов, но теперь у меня есть несколько текстур и несколько объектов. Я следовал совету в ответах, но я твердо верю, что на этот раз проблема в фрагментном шейдере.

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


    synchronized (mediaPlayerObject) {
        surfaceTextureMediaPlayer.updateTexImage();
        mediaPlayeUpdate = false;
    }


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

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

    GLES20.glUniform1i(textureUnitLocation2, 1);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[1]);

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

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



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






    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);

Вот фрагмент шейдера:

    #extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;
uniform samplerExternalOES b_Texture;

varying vec2 v_TextureCoordinates;

void main() {

    gl_FragColor = texture2D(u_Texture, v_TextureCoordinates) * texture2D(b_Texture, v_TextureCoordinates);
}

1 Ответ

1 голос
/ 13 января 2020

Во фрагментном шейдере нет необходимости во втором сэмплере текстуры, поэтому удалите b_Texture. Достаточно привязать объект текстуры к единице текстуры и установить индекс единицы текстуры к форме сэмплера текстуры:

#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;

varying vec2 v_TextureCoordinates;

void main() {

    gl_FragColor = texture2D(u_Texture, v_TextureCoordinates);
}

Draw 1-й объект:

GLES20.glUniform1i(textureUnitLocation, 1);
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[1]);

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

Draw 2-й объект:

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);

Обратите внимание, что нет необходимости использовать 2 разных текстурных блока. Вы можете использовать GL_TEXTURE0 в обоих случаях.

...