OpenGL/OpenGL ES (七) —— 初探

OpenGL/OpenGL ES (一) —— 专业名词快速了解
OpenGL/OpenGL ES (二) —— 渲染架构、图元、着色器、投影
OpenGL/OpenGL ES (三) —— 绘制甜甜圈
OpenGL/OpenGL ES (四) —— 纹理
OpenGL/OpenGL ES (五) —— 纹理翻转策略
OpenGL/OpenGL ES (六) —— 立方体旋转
OpenGL/OpenGL ES (七) —— 初探
OpenGL/OpenGL ES (八) —— 如何加载一张图片
OpenGL/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运算优势

OpenGL ES允许应⽤用程序利用底层图形处理器的强大功能。iOS设备上的GPU可以执⾏行行复杂的2D和3D绘图,以及最终图像中每个像素的复杂着⾊计算。值得注意的是OpenGL ES Client 的代码是在CPU上运算的。而OpenGL ES Server 是利用GPU并行运算的优势进行图形硬件绘制。


运算区域

OpenGL ES 3.0

  • 图形管线


    1.png
  • 图形管道


    2.png

1. 顶点着色器

  • 着⾊器程序: 描述顶点上执行操作的顶点着⾊器程序源代码/可执行文件。
  • 顶点着⾊器输⼊入(属性): ⽤顶点数组提供每个顶点的数据。
  • 统一变量(uniform): 顶点/片元着色器使用的不变数据。
  • 采样器: 代表顶点着色器使用纹理的特殊统一变量类型。
顶点着色器业务:
  • 矩阵变换位置
  • 计算光照公式生成逐顶点颜⾊
  • 生成/变换纹理坐标

它可以用于执行自定义计算,实施新的变换,照明或者传统的固定新功能所不允许的基于顶点的效果。顶点着色器最终赋值给内建变量
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;
}

2. 图元装配

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

3. 光栅化

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


3.png

4. 片段着色器/片元着⾊器

业务

计算颜色
获取纹理值
往像素点中填充颜色值(纹理或者颜色)

功能

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

着色器程序

描述片段上执行操作的顶点着色器程序源代码/可执行文件

输入变量

光栅化单元用插值为每个片段生成的顶点着色器蔬菜

统一变量(uniform)

顶点和片元着色器使用的不变的数据

采样器

代表片元着色器使用纹理的特殊统一变量类型

片元着色代码案例:
 varying lowp vec2 varyTextCoord; uniform sampler2D colorMap; void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord); 
}
逐⽚段操作
image.png
像素归属测试:
  • 确定帧缓存区中位置(Xw,Yw)的像素⽬目前是不不是归属于OpenGL ES所 有. 例例如,如果⼀一个显示OpenGL ES帧缓存区View被另外⼀一个View 所遮蔽.则窗⼝口系统
    可以确定被遮蔽的像素不不属于OpenGL ES上下⽂文.从⽽而不不全显示这些像素.⽽而像素归 属测试是OpenGL ES 的⼀一部分,它不不由开发者开⼈人为控制,⽽而是由OpenGL ES 内部进⾏行行.
裁剪测试:
  • 裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的一部分裁剪矩形范围 内.如果该片段位于裁剪区域之外,则被抛弃.
深度测试:
  • 输⼊片段的深度值进步比较,确定片段是否拒绝测试
混合:
  • 混合将新⽣成的片段颜色与保存在帧缓存的位置的颜色值组合起来.
抖动:
  • 抖动可用于最⼩小化因为使⽤有限精度在帧缓存区中保存颜色值⽽产生的伪像.

你可能感兴趣的:(OpenGL/OpenGL ES (七) —— 初探)