[TOC]

文章参考:https://blog.csdn.net/Kennethdroid/article/details/95622391

概述

OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。

OpenGLES 3.0 的特点

OpenGLES 3.0 实际上是 OpenGLES 2.0 的扩展版本,向下兼容 OpenGLES 2.0 ,但不兼容 OpenGLES 1.0

OpenGLES 3.0 主要新特性

纹理

  • sRGB 纹理和帧缓冲区——允许应用程序执行伽马校正渲染。

  • 2D 纹理数组——保存一组 2D 纹理的纹理目标。

  • 3D 纹理。一些 OpenGL ES 2.0 实现通过扩展支持3D纹理,而 OpenGL ES3.0 将此作为强制的功能。

  • 深度纹理和阴影比较——启用存储在纹理中的深度缓冲区。

  • 无缝立方图。在 OpenGL ES 3.0 中,立方图可以进行采样如过滤来使用相邻面的数据并删除接缝处的伪像。

  • 浮点纹理。

着色器

  • 二进制程序文件。在 OpenGL ES 3.0 中,完全链接过的二进制程序文件可以保存为离线二进制格式,运行时不需要链接步骤。
  • 有助于减少应用程序的加载时间。
  • 非方矩阵。支持方阵之外的新矩阵类型,并在 API中 增加了相关的统一调用,以支持这些矩阵的加载。
  • 全整数支持。支持整数(以及无符号整数)标量和向量类型以及全整数操作。
  • 平面/平滑插值程序。 OpenGL ES 3.0 中插值程序可以显式声明为平面或者平滑着色。
  • 统一变量块。统一变量值可以组合为统一变量块。统一变量块可以更高效地加载,也可在多个着色器程序间共享。
  • 布局限定符。顶点着色器输入可以用布局限定符声明,以显式绑定着色器源代码中的位置,而不需要调用 API 。

几何形状

  • 变换反馈。可以在缓冲区对象中捕捉顶点着色器的输出。
  • 布尔遮挡查询。应用程序可以查询一个(或者一组)绘制调用的任何像素是否通过深度测试。
  • 实例渲染。有效地渲染包含类似几何形状但是属性(例如变化矩阵、颜色或者大小)不同的对象。

代码实例

创建Native层代码

在C++的jni里面的cmake文件里面添加如下的配置:

1
2
3
4
5
6
7
8
# ================OpenGL ES的Native库,通过add_library会再生成一个jni的SO==========================
add_library(
# 设置库的名字。Java层调用可以使用:System.loadLibrary("nyx-opengles-lib");
nyx-opengles-lib
# Sets the library as a shared library.
SHARED #库的类型 共享库(动态)库、如果是STATIC的话,就是静态库
opengles/hello_opengl_es.cpp # 库关联所有的源文件
)
image-20210801004321393

具体的CMakeLists.txt的文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# CMake的构建提示
# https://developer.android.com/studio/projects/configure-cmake?hl=zh-cn
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
#CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt,
#并在其中包含 CMake 构建您的 C/C++ 库时需要使用的命令。如果您的原生源代码文件还没有 CMake 构建脚本,
#您需要自行创建一个,并在其中包含适当的 CMake 命令。
# CMakeLists.txt :设置构建本地库所需的CMake最低版本。
cmake_minimum_required(VERSION 3.4.1)

# 由于People是在people的二级目录下,如果我们想要在全局的搜索路径进行搜索
# 我们就需要放到全局的搜索路径下面,使用下面:
include_directories(people/)
# 这样我们在进行导入People类的时候
# 双引号是从相对路径进行搜索
# #include "people/People.h"
# 而尖括号是从全局搜索路径进行搜索.因为我们已经通过
# include_directories(people/) 将其加入到全局搜索目录下面,所以就可以直接使用尖括号
# include <People.h>
# 放到全局的搜索路径下面,使用下面:
include_directories(base/)
include_directories(jni/)
include_directories(thread/)

# 引用NDK中的库log,命名为log-lib。用于在安卓系统中查找一些动态库
# find_library这个函数的意思是给系统的log库起个别名,命名为log-lib。
# log-lib: 库路径对应的变量名
# log: 指的是原生NDK中的对应库名
find_library(log-lib log)


# ================OpenGL ES的Native库,通过add_library会再生成一个jni的SO==========================
file(GLOB opengl-src-files
${CMAKE_SOURCE_DIR}/jni/jni_nyx_opengl_es.cpp
${CMAKE_SOURCE_DIR}/opengl/*.cpp
${CMAKE_SOURCE_DIR}/opengl/samples/*.cpp)
# 设置库的名字。Java层调用可以使用:System.loadLibrary("nyx-opengles-lib");
# 库的类型 共享库(动态)库、如果是STATIC的话,就是静态库
add_library(nyx-opengles-jni
# Sets the library as a shared library.
SHARED
${opengl-src-files})

# 由于我们是需要调试OpenGLES3的Demo。所以我们需要链接EGL、GLESv3的动态链接库
target_link_libraries( # Specifies the target library.
nyx-opengles-jni
# Links the target library to the log library
# included in the NDK.
${log-lib}
EGL
GLESv3
android)

问题一:

1
androidStudio 报'stdint.h' file not found

解决掉其他的问题,重新构建一下CmakeList.txt文件就可以了。

归纳总结