如何将纹理仅绑定到OpenGLES中的一个对象? [英] How to bind texture just to one object in OpenGLES?

查看:176
本文介绍了如何将纹理仅绑定到OpenGLES中的一个对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在激活要绘制的对象之前的纹理.但是纹理同时显示在两个对象上.为什么?我应该在第一个绘制对象之前取消纹理绑定吗? -我尝试使用glDisable和glBindTexture,但没有帮助. 这是我的代码:

I am activating the texture just before the object to draw. But the texture is showing on both objects. Why is that so? Should I unbind the texture before the first object to draw? - I tried with glDisable and glBindTexture but it did not help. Here my code:

@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 This is my shader program:

    #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是状态引擎.设置状态后,它会一直保存到再次更改为止,甚至超出帧数.

OpenGL is a state engine. Once a state is set, it is kept until it is changed again, even beyond frames.

在第二个对象之前绑定命名的纹理对象,并在绘制第二个对象之后绑定默认的纹理对象(0).
此外,在绘制调用之前启用顶点属性,并在之后进行禁用:

Bind the named texture object before the 2nd object and bind the default texture object (0) after drawing the 2nd object.
Furthermore enable the vertex attributes before the draw call and disable it after:

对象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程序始终从纹理读取颜色:


The sahder program always reads the color form the texture:

void main() {

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

请注意,设置gl_FragColor的第一行是无用的,因为gl_FragColor在下一行中将被覆盖.

Note, the first line which set gl_FragColor is useless, because gl_FragColor is overwritten in the following line.

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

Since either the color attribute is not set (black) or the the color read from the texture is black, the colors can be summed:

void main() {

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

这篇关于如何将纹理仅绑定到OpenGLES中的一个对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆