OpenGL ES 3.0学习笔记-简介

可编程管线的各个阶段

1.顶点着色器

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

顶点着色器的输入包括:

  • 着色器程序–描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。

  • 顶点着色器输入(或者属性)– 用顶点数组提供的每个顶点的数据。

  • 统一变量– 顶点(或者片段)着色器使用的不变数据

  • 采样器–代表顶点着色器使用纹理的特殊统一变量类型

顶点着色器可以用于通过矩阵变换位置,计算照明公式来生成逐顶点颜色以及生成或者变换纹理坐标等基于顶点的传统操作。此外,因为顶点着色器由应用程序规定,所以它可以用于执行自定义计算,实施新的变换,照明或者传统的固定功能管线所不允许的基于顶点的效果。

简单实例

1
2
3
4
5
6
7
8
9
10
11
12
#version 300 es//版本号
uniform mat4 u_mvpMatrix;//变换矩阵
//输入数据
in vec4 a_position;//顶点坐标
in vec4 a_color;//顶点颜色
//输出数据
out vec4 v_color;//顶点颜色
void main()
{
v_color = a_color;
gl_Position = a_position * u_mvpMatrix;
}

2.图元装配

顶点着色器之后,管线的下一个阶段是图元装配。
图元是三角形,直线或者点精灵等几何对象。

对于每个图元,必须确定图元是否位于视锥体(屏幕上可见的3D空间区域)内,如果图元没有完全在视锥体内,则可能需要进行裁剪,如果图元完全处于该区域之外,它就会被抛弃。裁剪之后,顶点位置被转换为屏幕坐标。也可以执行一次淘汰操作,根据图元面向前方或者后方抛弃它们,裁剪和淘汰之后,图元便准备传递给管线的下一个阶段–光栅化阶段。

3.光栅化

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

4.片段着色器

片段着色器为片段上的操作实现了通用的可编程方法。
片段着色器的输入:

  • 着色器程序–描述片段上所执行操作的片段着色器程序源代码或者可执行文件。

  • 输入变量–光栅化单元用插值为每个片段生成的顶点着色器输出。

  • 统一变量–片段(或者顶点)着色器使用的不变数据。

  • 采样器–代表片段着色器所用纹理的特殊统一变量类型。

简单实例:

1
2
3
4
5
6
7
8
9
#version 300 es
precision mediump float;//默认的精度限定符
in vec4 v_color;
out vec4 fragColor;
void main()
{
fragColor = v_color;
}

5.逐片段操作

在逐片段操作阶段,在每个片段上执行如下功能:

  • 像素归属测试–这个测试确定帧缓冲区中位置(Xw,Yw)的像素目前是不是归OpenGL ES 所有。

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

  • 模板和深度测试–这些测试在输入片段的模板和深度值上进行,以确保片段是否应该被拒绝。

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

  • 抖动–抖动可用于最小化因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。

在逐片段操作的最后,片段或者被拒绝,或者在帧缓冲区的(Xw,Yw)位置写入片段的代码,深度或者模板值。写入片段颜色 深度和模板值取决于启用的相应写入掩码。写入掩码可以更精细的控制写入相关缓冲区的颜色,深度和模板值。

OpenGL ES 3.0新功能

  • 纹理

  • 着色器

  • 几何形状

  • 缓冲区对象

  • 帧缓冲区

OpenGL ES 3.0 和向后兼容性

EGL(iOS不支持)