(一)OpenGL ES 3.0简介
下一篇:(二)你好,三角形:https://www.jianshu.com/p/4dfd7510178e
Open GL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
OpenGL ES 3.0是从Open GL 3.3规范衍生而来。
OpenGL ES 3.0
OpenGL ES 3.0实现了具有可编程着色功能的图形管线由两个规范组成:Open GL ES 3.0 API规范和Open GL ES 着色语言3.0 规范。下图概述OpenGL ES 3.0图形管线流程:
OpenGL ES3.0图形管线.png顶点着色器
顶点着色器.png// 版本 OpenGL ES 3.0
#version 300 es
uniform mat4 u_mvpMatrix; // 统一变量 投影矩阵
in vec4 a_position; // 输入变量 顶点位置值
in vec4 a_color; // 输入变量 顶点颜色值
out vec4 v_color; // 输出变量 顶点颜色值
void main() {
v_color = a_color;
// 内建变量gl_Position 表示变换后的位置
gl_Position = u_mvpMatrix * a_position;
}
图元装配
图元(Primitive)是三角形、直线或者点精灵几何对象。将图元安置在视锥体(屏幕上可见的3D空间区域)的过程即为图元装配。
光栅化
光栅化是将图元转化为一组二维片段的过程,然后这些片段将由片段着色器处理。
光栅化.png
片段着色器
片段着色器.png#version 300 es
precision mediump float; // 设置默认精度
in vec4 v_color; // 输入变量 从顶点着色器输入的顶点颜色
out vec4 fragColor; // 输出变量 片段颜色
void main(){
fragColor = v_color;
}
逐片段操作
逐片段操作.png逐片段操作即在帧缓冲区的(x, y)位置写入片段的颜色、深度或者模板值。
OpenGL ES 3.0新功能
在纹理、着色器、几何形状、缓冲区对象、帧缓冲区等方面有许多改进。
1、渲染管线多重增强,实现先进视觉效果的加速,包括遮挡查询(Occlusion Query)、变缓反馈(Transform Feedback)、实例渲染(Instanced Rendering)、四个或更多渲染目标支持。
2、高质量ETC2/EAC纹理压缩格式成为一项标准功能,不同平台上不再需要需要不同的纹理集。
3、新版GLSL ES 3.0着色语言,全面支持整数和32位浮点操作。
4、纹理功能大幅增强,支持浮点纹理、3D纹理、深度纹理、顶点纹理、NPOT纹理、R/RG单双通道纹理、不可变纹理、2D阵列纹理、无二次幂限制纹理、阴影对比、调配(swizzle)、LOD与mip level clamps、无缝立方体贴图、采样对象、纹理MSAA抗锯齿渲染器。
5、一系列广泛的精确尺寸纹理和渲染缓冲格式,便携移动应用更简单。
OpenGL ES 3.0和后向兼容
OpenGL ES 3.0完全后向兼容OpenGL ES 2.0,意味着OpenGL ES 2.0的所有程序都可在3.0上正常运行。
EGL
EGL是Khronos渲染API和原生窗口系统之间的接口。
任何OpenGL ES应用程序都必须在开始渲染之前使用EGL执行以下任务:
1、查询并初始化设备商可用的显示器;
2、创建渲染表面;
3、创建渲染上下文;
OpenGL ES应用程序必须包括以下头文件:
#include <EGL/egl.h>
#include <GLES3/gl3.h>
EGL命令语法
所有EGL命令都以egl前缀开头,例如eglCreateWindowSurface()。
EGL数据类型如下:
EGL数据类型.png
OpenGL ES命令语法
所有OpenGL ES命令都以gl为前缀,以输入参数类型与个数为后缀。
例如:glUniform2i(location, 1, 0)表示用于指定统一变量,输入两个32位有符号整型的命令。
错误处理
若不正确使用OpenGL ES命令,应用程序会生成一个错误代码。通过glGetError()命令获得。
基本错误代码.png
基本状态管理
启用和停用管线的某个阶段
glEnable()
glDisable()
检查某个管线阶段状态
glisEnalbed()
延申阅读
OpenGL ES 3.0
https://www.khronos.org/registry/OpenGL-Refpages/es3.0/
EGL
https://www.khronos.org/egl
下一篇:(二)你好,三角形:https://www.jianshu.com/p/4dfd7510178e