从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建"/>
从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建
前言
在前文中,我主要分析了渲染引擎的整体架构。本文的主要内容是对OpenGL基础环境的搭建,主要涉及架构图中的Container、Graphic Wrapper和Platform层。
这里也放上代码仓的链接:。代码也是从零开始搭建,会逐步的完善功能。
一、OpenGL环境介绍
OpenGL是一些操作GPU的API集合。但是OpenGL并没有提供操作平台本地窗口的API。所以需要另外一套可以起到本地窗口和OpenGL之间桥梁作用的工具。OpenGL的维护组织Kronos也提供了一套本地窗口接口EGL,而苹果公司也为iOS系统提供了一套EAGL框架。
下面就对这两个工具、框架进行相关API介绍,以及如何在工程中应用,可能面临的问题。
二、OpenGL环境搭建基本流程
Android EGL 环境
如果开发过Android图形相关应用的开发,应该会了解过GLSurfaceView
。GLSurfaceView
已经为我们初始化好了OpenGL环境,我们只需要使用GL10
里的相关API实现OpenGL的调用。
但是,这些API都是Android的Java层接口。如果考虑到跨平台特性,就需要使用OpenGL的C++接口了。而NDK提供了EGL工具。在上篇文章中也提到了,Android平台的容器需要使用TextureView
或SurfaceView
,这两个控件中又可以产生或持有android.View.Surface
。而这个Surface
则可以通过JNI传递到C++层,用于创建本地窗口。
下面对EGL环境搭建和销毁进行详细介绍。
初始化
- 获取并初始化环境
EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
这两个API用于获取系统屏幕资源,并与其进行连接。设备有可能会有多个屏幕,eglGetDisplay
方法的参数就是用于选择屏幕。通常情况下,在手机上我们使用EGL_DEFAULT_DISPLAY
来获取默认主屏幕。
- 配置选择
EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
这个方法返回一些列满足给定属性的配置。举个栗子:
// Example
const EGLint config_attributes[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,EGL_DEPTH_SIZE, 24,EGL_STENCIL_SIZE,
更多推荐
从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建
发布评论