OpenGL绘制一张图片的流程--以android-openGL-canvas为例

本文详细介绍了使用OpenGL在Android中绘制图片的完整流程,包括创建EGLContext、设置Surface、准备顶点和纹理数据、编译链接着色器、设定绘制区域以及进行绘制操作。关键步骤包括编译链接shader、传入纹理和顶点数据,并通过model-view-projection矩阵进行变换。文章以android-openGL-canvas项目为示例,强调了性能优化和流程封装的重要性。
摘要由CSDN通过智能技术生成

样例代码来源: android-openGL-canvas

OpenGL文档参考:
OpenGL文档
本文只对流程做排序以及一些简单的说明,想了解原理的请查看OpenGL相关文档,有对相应函数有疑问的可查阅上述文档。

一、创建 eglContext。EGLContext 是一个比较重的对象,所以一般只创建一次。

例子代码代码主要在 EglHelper

  • egl = EGLContext.getEGL()
  • 获取 eglDisplay = eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY)
  • 获取 EGLConfig eglChooseConfig(..)
  • eglInitialize(mEgl, mEglDisplay, mEglConfig, eglContext)
  • 创建 eglContext = eglCreateContext(display, config, eglContext, attrib_list))

  • 大致的相关代码

    public EGLContext start(EGLContext eglContext) {
        if (GLThread.LOG_EGL) {
            Log.w("EglHelper", "start() tid=" + Thread.currentThread().getId());
        }
        /*
         * Get an EGL instance
         */
        mEgl = (EGL10) EGLContext.getEGL();

        /*
         * Get to the default display.
         */
        mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);

        if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {
            throw new RuntimeException("eglGetDisplay failed");
        }

        /*
         * We can now initialize EGL for that display
         */
        int[] version = new int[2];
        if (!mEgl.eglInitialize(mEglDisplay, version)) {
            throw new RuntimeException("eglInitialize failed");
        }
        mEglConfig = eglConfigChooser.chooseConfig(mEgl, mEglDisplay);

            /*
            * Create an EGL context. We want to do this as rarely as we can, because an
            * EGL context is a somewhat heavy object.
            */
        mEglContext = eglContextFactory.createContext(mEgl, mEglDisplay, mEglConfig, eglContext);
        if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) {
            mEglContext = null;
            throwEglException("createContext");
        }
        if (GLThread.LOG_EGL) {
            Log.w("EglHelper", "createContext " + mEglContext + " tid=" + Thread.currentThread().getId());
        }

        mEglSurface = null;

        return mEglContext;
    }

二、创建 surface

  • eglCreateWindowSurface(display, config, nativeWindow, surfaceAttribs)

  • 将 context 和 surface 联系起来。
    eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)

  • 如果需要更换surface,就先destroy现在的
    eglDestroySurface

  • 大致的相关代码

    public boolean createSurface</
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值