java - 在 OpenGL ES 2.0 中使用多个纹理

标签 java android opengl-es-2.0

我遇到了一个问题 latley。

我有一个 DrawableTexturedPlane 类。此类指定一个带有字节数组的简单 Plane 作为 Texture。可以通过简单的函数调用更改数组数据。好吧,该类将特定的着色器程序作为参数。在我的 OpenGL View 中,我需要其中的 2 个平面。好吧,第一个渲染正确,但第二个根本不显示。我很确定我遗漏了一些东西,但我不确定我的代码的哪一部分不正确。我将不胜感激 ;)

TexturedPlaneClass(相关部分):

public DrawableTexturedPlane( float[] fVertices, int nProgrammHandle, int nGLTextureChannel, int nGLTextureID ) 
    {  
        super( nProgrammHandle );
        m_bHasBorder = bHasBorder;

        m_nGLTextureChannel = nGLTextureChannel;
        m_oVertexBuffer = _GetVertexBuffer( fVertices );
        m_oTextureBuffer = _GetTextureCoordinates();



        GLES20.glActiveTexture( m_nGLTextureChannel );  
        // Set filtering
        GLES20.glTexParameterf( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST );
        GLES20.glTexParameterf( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST );
        GLES20.glTexParameteri( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE );
        GLES20.glTexParameteri( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE );

        m_cTexture = new byte[ 640 * 480 ];


        Log.i( "Java/DrawableTexturedPlane", "Drawable Textured Plane created!" );
    }

绘制方法:

 @Override
    public void Draw( float[] mvpMatrix )
    {

        GLES20.glActiveTexture( m_nGLTextureChannel );

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);

        GLES20.glUseProgram( m_nProgramHandle );


        m_HTextureUniform = GLES20.glGetUniformLocation( m_nProgramHandle, "uTexture" );
        m_HTextureCoordinate = GLES20.glGetAttribLocation( m_nProgramHandle, "TexCoordinate" );


        // get handle to the vertex shader's vPosition member
        m_nPositionHandle = GLES20.glGetAttribLocation( m_nProgramHandle, "vPosition" );


        ByteBuffer oDataBuf = ByteBuffer.wrap( m_cTexture );
        // Prepare the triangle data
        GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, 640, 480,
                             0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, oDataBuf );

        // Prepare the triangle data
        GLES20.glVertexAttribPointer( m_nPositionHandle, 3, GLES20.GL_FLOAT, false, 12, m_oVertexBuffer );
        GLES20.glEnableVertexAttribArray( m_nPositionHandle );

        GLES20.glVertexAttribPointer( m_HTextureCoordinate, 2, GLES20.GL_FLOAT, false, 12, m_oTextureBuffer); 
        GLES20.glEnableVertexAttribArray( m_HTextureCoordinate );

        m_nMVPMatrixHandle = GLES20.glGetUniformLocation( m_nProgramHandle, "uMVPMatrix");

        // Apply the projection and view transformation
        GLES20.glUniformMatrix4fv( m_nMVPMatrixHandle, 1, false, mvpMatrix, 0);

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

    }

下面是纹理和 2 个平面的创建方式:

 GLES20.glGenTextures( m_nTextureStorage.length, m_nTextureStorage, 0);

        for( int i : m_nTextureStorage )
        {
            GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, i );
        }


        m_oInfoPlane = new DrawableTexturedPlane( oInfoRect.GetAsFloatArray(), true, m_nShaderPrograms[0], GLES20.GL_TEXTURE0, m_nTextureStorage[0] );   
        m_oMainPlane =  new DrawableTexturedPlane( oMainRect.GetAsFloatArray(), true, m_nShaderPrograms[0], GLES20.GL_TEXTURE1, m_nTextureStorage[1] );

重点是,如果我用 GL_TEXTURE0 初始化 BOTH,它工作正常。 (虽然在 10-20 秒后会出现严重的闪烁,但我不知道为什么)。

如果我按照上面的方式初始化它们,只有带有 TEXTURE_0 的那个被正确显示,另一个看起来是黑色的。

我知道我应该编写一个 TextureManager 类,但是对于 2 个纹理,这太简单了。

提前致谢

最佳答案

您没有在正确的时间绑定(bind)纹理。另外,您不能将 2 个不同的纹理绑定(bind)到 GL_TEXTURE_2D。

它应该是这样的:

GLES20.glActiveTexture( m_nGLTextureChannel ); //Activate the texture channel

  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, nGLTextureID); //Bind here!
//Bind before you draw

I know i should write a TextureManager class, but for 2 Textures, this is a simple overkill.

至于这个不是现在,而是整个项目的需要。以后需要经理吗?前期设计是有返回的,但不要过火。 (有点矛盾!祝你好运!)

关于java - 在 OpenGL ES 2.0 中使用多个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050283/

相关文章:

android - EGL14类是什么意思?

ios - 是否可以通过 iOS 纹理缓存 API 从 OpenGL ES 帧缓冲区读取 float ?

java - Java 中 BigDecimal 的 BigInteger 幂

android - 为 x86 cpu 编译了 LibVLC .so 文件

android - 是否可以在 Android 的每个 ListView 项中为删除按钮的出现和消失设置动画?

安卓 WebView : Disable confirm navigation

iphone - GLKView设置可绘制属性

java - 如何在 spring-mvc 中为响应启用多个内容类型?

java替换字符串中的多个字符,包括 "\u00A2"

java - Websocket服务器检测数据库中的数据变化