OpenGL ES 3.0 简介

转载请以链接形式标明出处:
本文出自:103style的博客

OpenGL ES 3.0学习汇总

简介

  • OpenGL ES (OpenGL for Emberdded Systems)是以 手持嵌入式设备 为目标的高级3D图形应用编程接口(API)。

  • Android 4.3 +iPhone 5s + 已经支持OpenGL ES 3.0。

  • OpenGL ES 3.0 向后兼容 OpenGL ES 2.0

  • OpenGL ES 3.0 是从 OpenGL 3.3规范 衍生而来。


OpenGL ES 3.0 图形管线

OpenGL ES 3.0实现了具有 可编程着色功能 的图形管线,由 OpenGL ES 3.0 APIOpenGL ES 着色语言3.0规范 组成。
下图中深色背景的 顶点着色器片段着色器 为可编程阶段。
OpenGL ES 3.0 图形管线

顶点着色器

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

顶点着色器的输入包括:

  • 着色器程序一一描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。
  • 顶点着色器输人(或者属性)一一用顶点数组提供的每个顶点的数据。
  • 统一变量(uniform)一一顶点(或者片段)着色器使用的不变数据。
  • 采样器一一代表顶点着色器使用纹理的特殊统一变量类型。

下图是顶点着色器的输入输出模型。
OpenGL ES 3.0 顶点着色器 输入输出模型

顶点着色器取得一个位置及相关的颜色数据作为输入属性,用一个 4x4矩阵变换位置,并输出变换后的位置和颜色。

以下为顶点着色器示例:

#version 300 es   //提供着色语言的版本 必须出现在第一行
uniform mat4 u_mvpMatrix; # 统一变量 储存组合的模型视图和投影矩阵

in vec4 a_postion; # 顶点着色器输入的位置属性
in vec4 a_color;  # 顶点着色器输入的颜色属性

out vec4 v_color; # 顶点着色器输出的颜色属性
void main(){
  v_color = a_color; # 读取输入属性并写入输出属性上
  # 内建变量gl_Position 是自动声明的
  gl_Position = u_mvpMatrix * a_postion; # 变换后的位置写入gl_Positon输出
}

mat4 : 基本类型, 4 * 4浮点矩阵
vec4 : 基本类型,4分量浮点向量
uniform : 储存限定符,在图元处理中值不改变,统一变量组成了着色器、OpenGL ES 和 应用程序的链接。
in : 参数限定符,用于传入函数的函数参数
out : 参数限定符,用于传出函数,但是传入时没有初始化的参数

图元装配

OpenGL ES 3.0 图形管线,在 顶点着色器 之后就是 图元装配 了。
图元是 三角形、直线 或者 点精灵 等几何对象。
图元的每个顶点被发送到顶点着色器的不同拷贝,在图元装配期间,这些顶点被组合成图元。

对于每个图元,会抛弃图元不在 视锥体(屏幕可见的区域)内的部分,在视锥体内的区域的部分经过裁剪之后,将顶点位置转换为屏幕坐标。然后传递到管线的下一阶段 —— 光栅化阶段

光栅化

光栅化阶段 会绘制对应的 图元。
光栅化 是将 图元 转化为 二维片段 的过程,然后这些片段再由 片段着色器 处理。这些二维片段代表可在屏幕上绘制的像素。

下图为光栅化流程:
光栅化流程

片段着色器

片段上的操作 实现了通用的可编程方法。

采用 如下输入 对每个光栅化阶段的片段执行这个着色器。

  • 着色器程序——描述片段上所执行操作的片段着色器程序源代码或者可执行文件。
  • 输入变量——光栅化单元用插值为每个片段生成的顶点着色器输出。
  • 统一变量——片段(或者顶点)着色器使用的不变数据。
  • 采样器——代表片段着色器所用纹理的特殊统一变量类型。

OpenGL ES 3.0 片段着色器
片段着色器可以抛弃片段,也可以生成一个或多个颜色值作为输出。
片段着色器一般只输出一个颜色值,在 渲染多重目标 的时候会为每一个渲染目标输出一个颜色值。
光栅化阶段 生成的 颜色深度模板屏幕坐标位置(Xw,Yw 变成 OpenGL ES 3.0管线 逐片段操作 阶段的输入。

片段着色器示例:

#version 300 es  //提供着色语言的版本 
precision mediump float;  # 默认的精度限定符

in vec4 v_color; # 片段着色器的输入,即顶点着色器的输出
 
out vec4 fragColor; # 片段着色器的输出变量, 即传递到逐片段操作的颜色
void main()
{
   fragColor = v_color; # 输出颜色设置为输入颜色  片段着色器的输入在图元之间进行线性插值 然后传递给片段着色器
}

precision precision-qualifier type;
precision : 可以用来确定默认精度修饰符, type可以是intfloat采样器类型precision-qualifier可以是lowp, mediump, 或者highp。任何其他类型和修饰符都会引起错误。包括全局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将使用和它最近的precision语句中的精度。

highp: 精度和精度限定符,满足顶点语言的最低需求。
lowp: 精度和精度限定符,范围和精度低于mediump,但是任然能够表现所有颜色通道的所有颜色值。
mediump : 精度和精度限定符,范围和精度介于 highplowp之间。

FP = 浮点

FP范围FP幅值范围FP精度整数范围 有符号整数范围 无符号
highp(2-126,21270.0, (2-126,2127)2-24(2-31,231-1)(0,232-1)
mediump(2-14,214(2-14,214)2-10(2-15,215-1)(0,216-1)
lowp(-2,2)(2-8,2)2-8(2-7,27-1)(0,28-1)
逐片段操作

光栅化阶段生成的屏幕坐标为(Xw,Yw)的片段只能修改 帧缓冲区 中位置为(Xw,Yw)的像素。
下图描述了OpenGL ES 3.0 逐片段操作阶段。
OpenGL ES 3.0 逐片段操作阶段

  • 像素归属测试——确定帧缓区中的位置(Xw,Yw)的像素是不是归OpenGL ES 所有。被遮挡的像素则不属于OpenGL ES 的上下文,从而不显示这些像素。此过程在OpenGL ES 内部处理,不由开发人员控制
  • 剪裁测试—— 确定(Xw,Yw)是否位于OpenGL ES 状态的一部分的裁剪矩形范围内,抛弃范围之外的片段。
  • 模板测试、深度测试—— 这些测试在输入片段的 模板深度值 上进行 ,以确定片段是都该被拒绝。
  • 混合——将新生成的颜色和保存在帧缓冲区(Xw,Yw)位置的颜色值组合起来。
  • 抖动——用于最小化 因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。

在逐片段操作阶段的最后,片段 被拒绝 或者 在帧缓冲区(Xw,Yw)位置写入片段的颜色、深度或者模板值。
写入片段的颜色、深度或者模板值 取决于 启用的相应写入掩码。写入掩码可以更精细的控制写入的值。例如,可以设置颜色缓冲区的写入掩码 使得 任何红色值都不被写入到颜色缓冲区

OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器和程序   着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。   第6章——顶点属性、顶点数组和缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。   第7章——图元装配和光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。   第13章——同步对象和栅栏   第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值