如何在Android上使用OpenGL ES有效地渲染位图?

时间:2018-03-27 01:20:40

标签: android bitmap opengl-es

我的应用每秒生成25位图(1080 * 1920),我尝试通过将它们转换为纹理(调用createTexture())来渲染它们,然后使用默认渲染模式(调用OnDrawFrame() 50每秒一次)。但是,我的应用程序在启动后几秒钟就崩溃了。以这种方式使用OpenGL ES是否正确?或者有没有更好的方法来有效地渲染位图? 我渲染的主要代码如下:

    public abstract class BaseRenderer implements GLSurfaceView.Renderer{


        public BaseRenderer(Context context, String vertex, String fragment){           
            ...
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            GLES20.glClearColor(1.0f,1.0f,1.0f,1.0f);
            GLES20.glEnable(GLES20.GL_TEXTURE_2D);
            mProgram= ShaderUtils.createProgram(mContext.getResources(),vertex,fragment);
            glHPosition=GLES20.glGetAttribLocation(mProgram,"vPosition");
            glHCoordinate=GLES20.glGetAttribLocation(mProgram,"vCoordinate");
            glHTexture=GLES20.glGetUniformLocation(mProgram,"vTexture");
            glHMatrix=GLES20.glGetUniformLocation(mProgram,"vMatrix");
            onDrawCreatedSet(mProgram);
        }


        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            ...
        }

        @Override
        public void onDrawFrame(GL10 gl) {
            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);
            GLES20.glUseProgram(mProgram);

            onDrawSet();

            GLES20.glUniformMatrix4fv(glHMatrix,1,false,mMVPMatrix,0);
            GLES20.glEnableVertexAttribArray(glHPosition);
            GLES20.glEnableVertexAttribArray(glHCoordinate);
            GLES20.glUniform1i(glHTexture, 0);

            textureId=createTexture();

            GLES20.glVertexAttribPointer(glHPosition,2,GLES20.GL_FLOAT,false,0,bPos);
            GLES20.glVertexAttribPointer(glHCoordinate,2,GLES20.GL_FLOAT,false,0,bCoord);

            GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);
        }

        public abstract void onDrawSet();
        public abstract void onDrawCreatedSet(int mProgram);

        private int createTexture(){
            int[] texture=new int[1];
            if(mBitmap!=null&&!mBitmap.isRecycled()){
                GLES20.glGenTextures(1,texture,0);
                GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture[0]);
                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.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
                GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
                GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mBitmap, 0);
                return texture[0];
            }
            return 0;
        }
    }

0 个答案:

没有答案
相关问题