从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建

本文介绍从零开始构建跨平台渲染引擎的第一步——OpenGL基础环境搭建,包括Android的EGL和iOS的EAGL环境。内容涵盖环境介绍、搭建流程、多线程处理及工程化实践中的内存管理,旨在帮助开发者理解和实现OpenGL在不同平台的初始化和使用。

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

前言

前文中,我主要分析了渲染引擎的整体架构。本文的主要内容是对OpenGL基础环境的搭建,主要涉及架构图中的Container、Graphic Wrapper和Platform层。

这里也放上代码仓的链接:https://github.com/dongzhong/ReZero。代码也是从零开始搭建,会逐步的完善功能。

一、OpenGL环境介绍

OpenGL是一些操作GPU的API集合。但是OpenGL并没有提供操作平台本地窗口的API。所以需要另外一套可以起到本地窗口和OpenGL之间桥梁作用的工具。OpenGL的维护组织Kronos也提供了一套本地窗口接口EGL,而苹果公司也为iOS系统提供了一套EAGL框架。

下面就对这两个工具、框架进行相关API介绍,以及如何在工程中应用,可能面临的问题。

二、OpenGL环境搭建基本流程

Android EGL 环境

如果开发过Android图形相关应用的开发,应该会了解过GLSurfaceViewGLSurfaceView已经为我们初始化好了OpenGL环境,我们只需要使用GL10里的相关API实现OpenGL的调用。

但是,这些API都是Android的Java层接口。如果考虑到跨平台特性,就需要使用OpenGL的C++接口了。而NDK提供了EGL工具。在上篇文章中也提到了,Android平台的容器需要使用TextureViewSurfaceView,这两个控件中又可以产生或持有android.View.Surface。而这个Surface则可以通过JNI传递到C++层,用于创建本地窗口。

下面对EGL环境搭建和销毁进行详细介绍。

初始化

  1. 获取并初始化环境
EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);

EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);

这两个API用于获取系统屏幕资源,并与其进行连接。设备有可能会有多个屏幕,eglGetDisplay方法的参数就是用于选择屏幕。通常情况下,在手机上我们使用EGL_DEFAULT_DISPLAY来获取默认主屏幕。

  1. 配置选择
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,    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董小虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值