一、前言
OpenGL定义了一个跨编程语言、跨平台的专业图形程序接口。可用于二维或三维图像的处理与渲染,它是一个功能强大、调用方便的底层图形库。对于嵌入式设备,其提供了OpenGL ES(OpenGL for Embedded Systems)版本。
由于OpenGL是跨编程语言、跨平台的设计,所以在每个平台上都要有它的具体实现,负责提供OpenGL的上下文环境以及窗口的管理。在Android平台使用EGL提供本地平台对OpenGL ES的实现。
二、搭建OpenGL上下文环境
我们的目标是实现一个小Demo:在Android手机上利用OpenGL绘制一个三角形出来。
当然我们可以直接使用Android提供的GLSurfaceView,通过这种方式使用OpenGL比较简单,不需要我们再去搭建OpenGL上下文环境。本文我们不会去使用GLSurfaceView,而是直接借助EGL的API,在C++环境搭建出OpenGL上下文环境。
2.1 添加EGL库
首先,我们用Android Studio创建一个Native C++工程出来,编写CMakeList.txt文件,加入EGL库,文件内容如下:
cmake_minimum_required(VERSION 3.10.2)
project("eglrender")
add_library( # Sets the name of the library.
egl-render
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
EglJni.cpp
common/looper.cpp
common/MyLooper.cpp
render/GLRender.cpp
render/Triangle.cpp
gles/EglCore.cpp
gles/GLUtils.cpp )
find_library(log-lib log)
find_library(EGL-lib EGL)
find_library(GLESv2-lib GLESv2)
target_link_libraries(
# Specifies the target library.
egl-render
android
${log-lib}
${EGL-lib}
${GLESv2-lib} )
关注target_link_libraries选项,在链接时,我们添加了android、EGL-lib、GLESv2-lib三个库。在搭建OpenGL上下文环境,以及执行OpenGL程序需要用到这三个库中的方法。
2.2 创建EGL上下文
首先,需要获取显示设备,通过eglGetDisplay方法获取
mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mEGLDisplay == EGL_NO_DISPLAY) {
return false;
}
然后,调用eglInitialize()来初始化这个显示设备:
// 不关心版本号,直接传0即可
if (!eglInitialize(mEGLDisplay, 0, 0)) {
return false;
}
EGL有了Display之后,我们需要准备配置选项,比如:色彩格式、像素格式、SurfaceType等。最终通过eglChooseConfig得到配置选项信息。
const EGLint attribList[] = {
EGL_BUFFER_SIZE, 32,
EGL_ALPHA_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE };
// 获取config
EGLConfig config