JHHK

欢迎来到我的个人网站
行者常至 为者常成

9、OpenGL ES初探

目录

OpenGL ES简介

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 for Embedded Systems(OpenGL ES)是OpenGL的简化版本,它消除了冗余功能,提供了一个既易于学习⼜更易于在移动图形硬件中实现的库。

OpenGL ES允许应用程序利⽤底层图形处理器的强大功能。iOS设备上的GPU可以执⾏复杂的2D和3D绘图,以及最终图像中每个像素的复杂着⾊计算.

OpenGL ES 3.0 图形管线

OpenGL ES 3.0 图形管道

流程图示

OpenGL 顶点着色器

一、顶点着色器业务

顶点着色器实现了顶点操作的通用可编程方法。

1、通过矩阵变换位置

2、计算光照公式生成逐顶点颜色

3、生成或变换纹理坐标

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

二、顶点着色器输入输出

顶点着色器的输入包括:

1、着色器程序:描述顶点上执⾏操作的顶点着色器程序源代码(GLSL代码)或者可执行⽂文件

2、属性Attributes:用顶点数组提供的每个顶点的数据。

3、统一变量uniform:顶点(或者片段)着色器使用的不变数据(例如旋转矩阵)

4、采样器:代表顶点着色器使用纹理的特殊统一变量类型。

三、顶点着色器相关GLSL代码

//attribute 和 uniform 对应 通道修饰符 ,分别是 attribute属性通道 和 uniform 通道
//vec4、vec2 和 mat4 对应数据类型

attribute vec4 position;            //顶点坐标  vector4四维向量
attribute vec2 textCoordinate;      //纹理坐标  vector2二维向量
uniform mat4 rotateMatrix;          //旋转矩阵  matrix4 4*4矩阵
varying lowp vec2 varyTextCoord;    //varying 代表的也是一种通道,lowp 是一个精度,低精度、高精度等,可以不写。
void main()
{
// 把textCoordinate交给varyTextCoord,就可以把纹理坐标传递到片元着色器里面去。
    varyTextCoord = textCoordinate;

    vec4 vPos = position;
    vPos = vPos * rotateMatrix;// 让每一个顶点都和旋转矩阵相乘
    
    gl_Position = vPos;// gl_Position是一个内建变量,是vec4类型的,必须给它赋值。
}

GPU 来执行上述代码,有几个顶点就会执行其次,GPU 是并行的,所以会并行把所有顶点都执行了

图元装配与光栅化

一、图元装配

顶点着色器之后的下一阶段是 图元装配。

图元装配就是将顶点数据计算组合成一个个图元(点、线、三角形等几何对象),在这个阶段会执行裁剪、透视分割和 Viewport 变换操作。

图元类型和顶点确定将被渲染的单独图元。对于每个单独图元及其对应的顶点,图元装配阶段执⾏的操作包括:将 顶点着⾊器的输出值 执⾏ 裁剪透视分割视⼝变换后进⼊光栅化阶段

二、光栅化

1、解释一

光栅化其实是⼀种将⼏何图元变为二维图像的过程。该过程包含了两部分的工作。

第一部分⼯作:决定窗⼝坐标中的哪些整型栅格区域被基本图元占用;

第⼆部分⼯作:分配一个颜⾊色值和⼀个深度值到各个区域。

光栅化过程产生的是⽚元.

2、解释二

从另一个角度解释,就是把物体的数学描述以及与物体相关的颜⾊信息 转换为 屏幕上对应位置的像素及用于填充像素的颜⾊,这个过程称为光栅化。这是一个将模拟信号转化为离散信号的过程。

3、图示

在这个阶段绘制对应的图元(点/线/三⻆角形). 光栅化就是将图元转化成⼀组⼆维⽚段的过程.⽽这些转化的⽚段将由⽚元着⾊器处理.这些⼆维⽚段就是屏幕上可绘制的像素.

片元着色器

一、片元着色器的业务

1、计算颜色

2、获取纹理值

3、往像素点中填充颜色值【纹理值/颜色值】

它可以用于图片/视频/图形中每个像素的颜色填充(比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改)

二、片元着色器输入输出

片元/⽚段着色器的输入包括:

1、着色器程序:描述⽚段上执⾏操作的片元着⾊器程序源代码/可执行⽂件。

2、输入变量:光栅化单元用插值为每个片段生成的顶点着⾊器输出。

3、统一变量uniform:顶点(或者片段)着色器使用的不变数据。

4、采样器:代表⽚元着色器使⽤纹理的特殊统一变量类型

三、片元着色器相关GLSL代码

//顶点着色器 里的 varying lowp vec2 varyTextCoord;和 片元着色器 里的 varying lowp vec2 varyTextCoord;
//必须定义的一模一样才行,包括通道、精度、类型和变量名都要一致,这样才能从顶点着色器传进来
varying lowp vec2 varyTextCoord;

//uniform sampler2D colorMap 是由 uniform 通道传进来的纹理采样器,通过它可以拿到对应的纹理。
uniform sampler2D colorMap;

void main()
{
    // texture2D(纹理采样器, 纹理坐标); 为了取得纹素(纹理对应坐标上的颜色值),比如取到了一个rgba四维变量
    gl_FragColor = texture2D(colorMap, varyTextCoord);
}

逐片段操作(了解)

片元着色器之后,下一阶段就是 逐片段操作。

像素归属测试:这个测试确定帧缓存区中位置 (Xw, Yw) 的像素目前是不是归 OpenGL ES 所有。例如,如果⼀个显示 OpenGL ES 帧缓存区窗口的窗口被另外一个窗口所遮蔽,则窗⼝系统可以确定被遮蔽的像素不属于 OpenGL ES 上下文。从⽽完全不显示这些像素。虽然像素归属测试是 OpenGL ES 的⼀部分,但它不由开发人员控制,⽽是在 OpenGL ES 内部进行。

裁剪测试:裁剪测试确定 (Xw, Yw) 是否位于作为 OpenGL ES 状态的一部分的裁剪矩形范围内。如果该⽚段位于裁剪区域之外,则被抛弃。

深度测试:输⼊片段的深度值比较,确定⽚段是否应该被拒绝。

混合:混合将新生成的⽚段颜⾊值与保存在帧缓冲区 (Xw, Yw) 位置的颜⾊值组合起来。

抖动:抖动可用于最⼩化,因为使用有限精度在帧缓存区中保存颜色⽽产生的伪像。

EGL (Embedded Graphics Library )(了解)

OpenGL ES 命令需要 渲染上下文 和 绘制表面 才能完成图形图像的绘制。

渲染上下文:存储相关 OpenGL ES 状态。

绘制表⾯:是⽤于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜色缓冲区、深度缓冲区和模板缓冲区。

OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原⽣窗⼝系统。EGL 是 Khronos 渲染 API(如OpenGL ES)和原生窗口系统之间的接口。唯一⽀持 OpenGL ES 却不⽀持 EGL 的平台是 iOS。Apple 提供自己的 EGL API 的 iOS 实现,称为 EAGL。 因为每个窗⼝系统都有不同的定义,所以 EGL 提供基本的不透明类型—EGLDisplay,这个类型封装了所有统相关性,⽤于和原⽣生窗⼝系统接口。


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.