9-1. OpenGL ES

2020-10-23  本文已影响0人  Pufus

OpenGL ES(OpenGL for Embedded Systems) 是以手持和嵌入式为目标的高级3D图形应用程序编程接口(API). OpenGL ES 是目前智能⼿机中占据统治地位的图形API.支持的平台: iOS, Andriod , BlackBerry ,bada ,Linux ,Windows.

OpenGL ES 开放式图形库(OpenGL的)⽤于可视化的二维和三维数据。它是一个多功能开放标准图形库,支持2D和3D数字内容创建,机械和建筑设计,虚拟原型设计,⻜行模拟,视频游戏等应用程序。您可以使用OpenGL配置3D图形管道并向其提交数据。顶点被变换和点亮,组合成图元,并光栅化以创建2D图像。OpenGL旨在将函数调用转换为可以发送到底层图形硬件的图形命令。由于此底层硬件专用于处理图形命令,因此OpenGL绘图通常⾮常快。
OpenGL ESOpenGL的简化版本,它消除了冗余功能,提供了⼀个既易于学习⼜更易于在移动图形硬件中实现的库
OpenGL ES是跨平台的,不会提供窗口相关方法,需要系统各自提供载体

OpenGL ES渲染流程
OpenGL ES的渲染主要分为两部分:CPU和GPU

CPU部分

app代码通过OpenGL ES API,会调度OpenGL ES Framework
通过OpenGL ES client 调度 OpenGL ES server,将顶点数据等传递到GPU

GPU部分

做一些图形硬件的处理,例如光栅化、显示等

OpenGL ES 图形管道
API:可以通过API操作顶点缓冲区、顶点着色器、纹理坐标、片段着色器 苹果官方图
顶点着色器 (vertex shader)
顶点着色器

顶点着色器的业务内容:

  1. 矩阵变换位置
  2. 计算光照公式⽣成逐顶点颜⾊
  3. ⽣成/变换纹理坐标

总结: 它可以⽤于执行⾃自定义计算,实施新的变换,照明或者传统的固定功能所不允许 的基于顶点的效果。

顶点着色器GLSL代码示例:

attribute、uniform 表示client与server之间的通道
其中的vec4、vec2都是向量类型,表示四维向量和二维向量
mat4:4*4矩阵
varying是修饰符:通过varying将纹理坐标传入到片元着色器
lowp:低精读
main中的操作
  实现了纹理坐标的桥接
  实现了顶点旋转矩阵的相乘:列向量 与 列矩阵 相乘,得到旋转后的顶点坐标
  将上述得到的顶点坐标,赋值给gl_Position
*********************************************************
attribute vec4 position;
attribute vec2 textCoordinate; 
uniform mat4 rotateMatrix; 
varying lowp vec2 varyTextCoord; 
void main()
{
    varyTextCoord = textCoordinate;
    vec4 vPos = position;
    vPos = vPos * rotateMatrix;
    gl_Position = vPos; 
}

图元装配

顶点着⾊器之后,下⼀个阶段就是图元装配.
图元(Primitive): 点,线,三⻆角形等.
图元装配: 将顶点数据计算成⼀个个图元.在这个阶段会执⾏裁剪、透视分割和 Viewport变换操作。
图元类型和顶点索确定将被渲染的单独图元。对于每个单独图元及其对应的顶点,图元装配阶段执行的操作包括:将顶点着⾊器的输出值执⾏裁剪、透视分割、视⼝变换后进⼊入光栅化阶段。

光栅化

将图元转化为一组二维片段的过程,主要是由于屏幕是2D的,所以转换的像素点也是二维的

光栅化
片源着色器(fragment shader)
片源着色器

片元着色器的业务内容:
1.计算颜色
2.获取纹理值
3.往像素点中填充颜色值(纹理值/颜色值)

总结: 它可以⽤于图片/视频/图形中每个像素的颜⾊填充(⽐如给视频添加滤镜,实际上就是将视频中每个图⽚的像素点颜⾊填充进行修改.)

片元着色器GLSL代码示例

varying:必须和顶点着色器中一模一样,这样才能传递纹理坐标
sampler2D 采样器类型
texture2D(纹理采样器,纹理坐标):获取对应位置/坐标的颜色值,简称获得纹素
gl_FragColor(内建变量):将最终的颜色值赋值给它
*********************************************************
varying lowp vec2 varyTextCoord; 
uniform sampler2D colorMap;
void main() {
gl_FragColor = texture2D(colorMap, varyTextCoord); }

逐片段操作

这个过程都是GPU内部处理的,开发者并不需要关心,将处理好的数据存储到帧缓存区,最后读取帧缓存区将图形显示到屏幕上

image
OpenGL ES的应用

图片滤镜

视频滤镜
原理以及处理方式是一样的(GLSL代码),视频也是一帧一帧处理的,而一帧就是一张图片

EGL(Embedded Graphics Library)

上一篇 下一篇

猜你喜欢

热点阅读