1、Opengl能做什么
opengl是一个2d与3d的图片库。
- 视频渲染就是通过opengl实现。
- 图像、视频编辑及各种特效
- 游戏引擎
- 虚拟现实
- 3D建模
2 常见的2D/3D图形应用接口
图形应用接口 | 优点 | 缺点 |
---|---|---|
OpenGl ES | OpenGl的移动版 、 跨平台 | 学习曲线较高 、 架构老化 、效率略低 |
VulKan | 新一代图形接口,代替OpenGl 、高性能、跨平台 | 学习曲线高、支持度不如Opengl |
Metal | 高性能、API简单易用 | 不支持跨平台 |
Direct3D | 性能高 API简单易用 | 不支持跨平台 |
WebGL | web图形API 、易于集成 | 性能差 |
WebGPU | 新一代Web图形API 、性能高 、易于集成 | 适配性差点 |
3 OpenGL简介
- 1992年发布第一个版本,到现在有30多年历史
- 1997年支持多平台
- 2003年发布2.0,是其一个重要版本,加入了shader
- 2008年发布3.0,功能得到较大提升
- 2014年4.4和GLES3.0发布,移除过时API,功能统一
4 图形渲染管线
将3D图像绘制到2D屏幕上的流程,多GPU并行操作,成为流水线。
图形管线也叫渲染管线,是将渲染数据(例如模型、材质、贴图等内容)进行整合、运算并最终显示到屏幕的流程。渲染管线将渲染的整个流程划分为了若干个阶段,每一个阶段的计算过程都依赖上一个阶段的计算结果,就像工厂内的生产流水线,每一个环节都有专门的步骤来对原材料进行加工,这就是它被称为渲染管线或渲染流水线的原因。
图形管线简单而言可以分为程序阶段、几何阶段以及光栅化阶段三大阶段,每一大阶段又由若干个小阶段或者细节构成。
应用程序阶段在cpu中执行,几何阶段和光栅化阶段都是在GPU中执行。
应用程序阶段
顶点坐标数据
/**
* 三角形顶点位置
*/
private val triangleCoors = floatArrayOf(
0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
)
光照
摄像机位置
纹理:类比墙面、皮肤
shader程序
/*
* 顶点位置程序
*/
private val vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() { " +
" gl_Position = vPosition;" +
"}"
几何变换
模型变换-》视图变换-》顶点着色-》曲面细分-》顶点增减-》投影变换-》视口裁剪-》屏幕映射
投影变换:3D空间模型投影到2D上
视口裁剪:3D空间物体可能是比较大的,会超出视口,超出的部分会被裁剪掉。
光栅化
三角形组装:对定点的输入数据(比如颜色、法线、纹理坐标)进行插值得到各个像素对应的数据值,为后面的像素着色提供数据
遍历三角形:将三角形所覆盖的像素位置找出来,并生成对应的片元(像素),同时进行插值计算得到片元的属性(如颜色、法线、纹理坐标等)
片元着色:对每个片元进行颜色计算,例如进行纹理采样,光照计算,阴影处理等
片元操作:片元操作是对每个片元进行一些测试和混合,例如裁剪测试,深度测试,模版测试,Alpha测试和alpha混合等。