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

问题描述 投票:1回答:1

我正在绘制对象之前激活纹理。但是纹理同时显示在两个对象上。为什么呢?我应该在第一个绘制对象之前取消纹理绑定吗? -我尝试使用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);

UPDATE这是我的着色器程序:

    #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-es glsl shader textures gldrawarrays
1个回答
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

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

void main() {

    gl_FragColor = v_Color + texture2D(u_Texture, v_TextureCoordinates);
}
© www.soinside.com 2019 - 2024. All rights reserved.