OpenGL ES 2.0屏幕闪烁

时间:2012-08-20 08:28:56

标签: android opengl-es-2.0

我面临一个大问题。我正在使用带有Android 4.0.3的Transformer tf101标签。

我的应用正在使用自定义OpenGL ES 2.0表面。我正在使用纹理渲染多个平面。这种纹理正在改变。每秒20次,并通过传递字节数组进行更新。但是,在某些情况下,屏幕开始闪烁并且不会渲染新纹理。其他UI元素仍然响应并按预期执行其工作。似乎OpenGL上下文忽略了所有命令并且没有响应。

发生这种情况时,我的logCat中会显示几行:

08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit: NvError_IoctlFailed with error code 1

接着是

08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 13, SyncPointValue = 879005, returning = 0)

以及其中一些:

08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 196623, SyncPointValue = 0)

以下是我创建纹理平面的方法:

    m_nTextureStorage[0] = 0;

    GLES20.glGenTextures( 1, m_nTextureStorage, 0);
    GLES20.glActiveTexture( GLES20.GL_TEXTURE0 );
    GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, m_nTextureStorage[ 0 ] );

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

以下是我如何绘制它:

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

        //GLES20.glUniformMatrix4fv(m_HMVPMatrixUniform, 1, false, mvpMatrix, 0); 
        GLES20.glUseProgram( m_nProgramHandle );
        ByteBuffer oDataBuf = ByteBuffer.wrap( m_sTexture );

        m_HTextureUniform = GLES20.glGetUniformLocation( m_nProgramHandle, "uTexture" );
        m_HTextureCoordinate = GLES20.glGetAttribLocation( m_nProgramHandle, "TexCoordinate" );
        GLES20.glUniform1iv( m_HTextureUniform, 2, m_nTextureStorage, 0 );

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


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

OpenGL渲染器通过传递mvpMatrix简单地调用我的TexturedPlane的draw函数。我没有删除任何纹理,因为我已经读过android系统会自动处理它。

我认为它有一些关于GPU进行OOM的事情,但我不确定,因为我没有发现任何与发布的错误消息相关的内容。

谢谢它提前!

更新:

Rendermode设置为RENDER_WHEN_DIRTY。将其更改为RENDERMODE_CONTINOUSLY后,问题就消失了......很奇怪。由于这只是一种解决方法而且没有解决方案,我仍然在寻求帮助;)

连续退出渲染模式是没有选择的,因为这会消耗很多处理器时间并且毫无意义,因为只有在生成新纹理时才需要渲染。

2 个答案:

答案 0 :(得分:3)

终于找到了解决方案。

当我在每个渲染圈后调用glFlush()时,它工作正常。我没有在不同的纹理通道上渲染每个平面,它到目前为止工作得很好。谢谢你的帮助。

答案 1 :(得分:0)

当你致电..:

GLES20.glUniform1iv( m_HTextureUniform, 2, m_nTextureStorage, 0 );

我认为that binds a particular texture unit to the sampler uniform。但是你传递了一个纹理名称/对象/句柄/无论什么(它不是纹理单元。)也许这只是巧合,而你只传入0(这可能是m_nTextureStorage中的纹理名称,是巧合的正确/期望值?

或许这会导致用户空间驱动程序崩溃。