OpenGL进阶之构建通用框架

2019-03-08  本文已影响0人  溫順尚早


一、关于GLSurfaceView

二、关于GLSurfaceView.Renderer

public class DefaultRenderer extends BaseRenderer {
  @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        super.onSurfaceCreated(gl, config);
        // 创建可以绘制纹理的基类Filter
        defaultFilter = new DefaultFilter(mContext);
        videoBuffer = CoordinateHelper.calculateDefaultBuffer();
        // 创建纹理ID,如果频繁调用onDrawFrame(),则不可将ID创建放在其中,不及时销毁会爆内存的;
        defaultTextureId = ShaderHelper.createTexture(GLES20.GL_TEXTURE_2D, bitmap);
    }

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

    private void calculateVertexMatrix() {
        Matrix.setIdentityM(vertexMatrix, 0);
        float bmpRatio = bitmap.getWidth() * 1.0f / bitmap.getHeight();
        float viewRatio = mViewWidth * 1.0f / mViewHeight;
        if (viewRatio < bmpRatio){
            // 齐高放大宽
            float scale = bmpRatio / viewRatio;
            Matrix.scaleM(vertexMatrix, 0, scale, -1.0f, 1.0f);
        }else{
            // 齐宽放大高
            float scale = viewRatio / bmpRatio;
            Matrix.scaleM(vertexMatrix, 0, 1.0f, -scale, 1.0f);
        }
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        super.onDrawFrame(gl);
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
        GLES20.glViewport(0, 0, mViewWidth, mViewHeight);
        if (defaultFilter != null) {
            defaultFilter.onDraw(vertexMatrix, ShaderHelper.IDENTITY_MATRIX,
                    defaultTextureId, videoBuffer);
        }
    }
}

三、关于Filter框架

上一篇下一篇

猜你喜欢

热点阅读