OpenGL ES 3.0-图形管线各阶段概述

OpenGL ES 3.0实现了具有可编程着色功能的图形管线。下面概述OpenGL ES 3.0图形管线的各个阶段。

OpenGL ES 3.0 图形管线

其中片段着色器也叫片元着色器

顶点着色器

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

顶点着色器的输入包括:

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

在图元光栅化阶段,为每个生成的片元计算顶点着色器输出值,并作为输入传递给片元着色器。
上面这句话可能不大好理解,我这里稍微整理了下,
主要就是要明确和理解以下两个流程:

  • 光栅化:组装好的图形---转化--->片元
  • 在图元光栅化阶段:为每个生成的片元---计算出--->顶点着色器输出值---然后传递给--->片元着色器

插值(Interpolation):
用于从分配给每个图元顶点的顶点着色器输出生成每个片元值的机制。

顶点着色器可以用于通过矩阵变换位置、计算照明公式来生成逐顶点颜色以及生成或者变换纹理坐标等基于顶点的传统操作。

顶点着色器是由应用程序规定的,故而它可以用于执行自定义计算,实施新的变换、照明或者较传统的固定功能管线所不允许的基于顶点的效果

代码示例:

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

/* matrix to convert a_ position 
  from model space
  to normalized device space
*/
uniform mat4 u_mvpMatrix; 

// attributes input to the vertex shader
in vec4 a_position;    // position value
in vec4 a_color ;      // input vertex color

// output of the vertex shader - input to fragment
// shader
out vec4 v_color;  // output vertex color
void main()
{
  v_ color = a_color ;
  gl_Position = u_mvpMatrix * a_position;
}

图元装配

  • 图元( Primitive)是三角形、直线或者点精灵等几何对象。

  • 图元的每个顶点被发送到顶点着色器的不同拷贝。在图元装配期间,这些顶点被组合成图元。

  • 对于每个图元,必须确定图元是否位于视锥体(屏幕上可见的3D空间区域)内:
    1) 图元没有完全在视锥体内:可能需要进行裁剪
    2) 图元完全处于该区域之外:它就会被抛弃

  • 裁剪之后,顶点位置被转换为屏幕坐标。也可以执行一次淘汰操作,根据图元面向前方或者后方抛弃它们。

  • 裁剪和淘汰之后,图元便准备传递给管线的下一阶段-光栅化阶段

光栅化

  • 此阶段绘制对应的图元(点精灵、直线或者三角形)。

  • 光栅化是将图元转化为一组二维片元的过程,然后,这些片元由片元着色器处理。

  • 这些二维片段代表着可在屏幕上绘制的像素。

光栅化阶段

片元着色器

  • 片元着色器为片元上的操作实现了通用的可编程方法。

  • 片元着色器就是为了输出颜色值的。

光栅化阶段生成的每个片元执行这个着色器,采用如下输入:

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

  • 一般来说,除了渲染到多重渲染目标之外,片元着色器只输出一个颜色值;
    多重渲染目标的情况下,为每个渲染目标输出一个颜色值

  • 光栅化阶段生成的颜色、深度、模板和屏幕坐标位置(xw, yw)变成OpenGL ES 3.0管线逐片元操作阶段的输入。

代码示例:

/*
  示例说明:
  描述了一个简单的片元着色器
*/
precision mediump float;
in vec4 v_color;  // input vertex color from vertex shader
out vec4 fragColor;  // output fragment color

void main ()
{
  fragColor = v_color;
}

逐片段操作

** 逐片段操作是在片元着色器下一个阶段进行的。*

逐片段操作
  • 像素归属测试:这个测试确定帧缓冲区中位置(Xw,Yw)的像素目前是不是归OpenGL ES所有。这个测试使窗口系统能够控制帧缓冲区中的哪些像素属于当前OpenGL ES上下文。例如,如果一个显示OpenGL ES帧缓冲区窗口的窗口被另一个窗口所遮蔽,则窗口系统可以确定被遮蔽的像素不属于OpenGL ES上下文,从而完成不显示这些像素。虽然像素回归测试是OpenGL ES的一部分,但是它不由开发人员控制,而是在OpenGL ES内部进行。
  • 裁剪测试:裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的一部分裁剪矩形范围内。如果该片段位于裁剪区域之外,则被抛弃。
  • 模板和深度测试测试:这些测试在输入片段的模板和深度值上进行,以确定片段是否应该被拒绝。
  • 混合:混合将新生成的片段颜色值与保存在帧缓冲区(Xw,Yw)位置的颜色值组合起来。
  • 抖动:抖动可用于最小化因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。
  • 在逐片段操作阶段的最后,片段或者被拒绝,或者在帧缓冲区的(Xw, Yw)位置写入片段的颜色、深度或者模板值。
  • 写入片段颜色、深度和模板值取决于启用的相应写入掩码。
  • 写入掩码可以更精细地控制写入相关缓冲区的颜色、深度和模板值。例如,可以设置颜色缓冲区的写入掩码,使得任何红色值都不被写入颜色缓冲区。

你可能感兴趣的:(OpenGL ES 3.0-图形管线各阶段概述)