Android平台使用OpenGL实现图形渲染

本文详细介绍了如何在Android平台上,通过原生C++使用EGL库搭建OpenGL ES上下文环境,并创建EGLSurface,最终执行OpenGL指令绘制一个红色三角形的过程。内容包括添加EGL库、创建EGL上下文、创建显示EGLSurface以及执行OpenGL绘制的具体步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值