
我们从上图入手,来分析一下OpenGL的渲染流程。
客户机、服务器
- 管线分成了两部分。上半部分是客户机端,下半部分是服务器端。这种基本的客户机-服务器设计是在管线的客户机端在功能上从服务器端分离出来时开始采用的。
- 客户机是存储在CPU存储器中,并且在应用程序中执行,或者在主系统内存中的驱动程序中执行。驱动程序将渲染命令与数据组合起来,并发送到服务器执行。在一台典型的桌面计算机上,服务器会跨越一些系统总线,实际上,它就是图形加速卡上的硬件和内存。
- 服务器和客户机在功能上是异步的,客户机不断地将数据块和命令块组合在一起并送入缓冲区,然后这些缓冲区会发送到服务器执行。如果服务器停止工作等待客户机,或者客户机停止工作来等待服务器做好接受更多命令和数据的准备,这种情况被称为管线停滞。这不是理想的情况,为了获得最佳性能,我们希望两方面都尽可能不停的工作。
着色器
- 着色器是使用GLSL编写的程序,这些着色器必须从源代码中编译和链接到一起才能使用。最终准备就绪的着色器程序在第一阶段构成顶点着色器,在第二阶段构成片元着色器。实际上还有一种几何着色器选择性地安排在两者之间,还有一些传递片段的处理特性,诸如混合、模板和深度测试等。
- 顶点着色器处理从客户机输入的数据,包括应用变换、计算光照效果、位移、颜色值等等。每个顶点都会执行一次。
- 图元组合意味着顶点已经组合在一起,并逐个片段地进行了光栅化,再交由片元着色器逐个进行填充,最终把效果渲染在屏幕上。
当然我们首先要为这些着色器提供数据,否则什么也没有效果。有3种向着色器传递渲染数据的方法,即属性、uniform值和纹理。
属性
- 属性就是一个对每个顶点都要做改变的数据元素。实际上,顶点位置本身就是一个属性。属性值可以是浮点数、整数或布尔数据。
- 属性以四维向量(x,y,z,w)的形式进行内部存储,忽略第3个分量自动设为0,忽略第4个分量自动设为1。
- 属性也包括纹理坐标、颜色值、光照计算的表面法线等。
- 属性会从本地客户机内存中复制存储在图形硬件中的一个缓冲区上。这些属性只提供给顶点着色器使用,对于片元着色器没什么意义。
- 这些属性对每个顶点都要做改变,但并不意味着它们的值不能重复。通常情况下,它们都是不一同的,但有可能整个数组都是同一值的情况。
Uniform值
- Uniform值是一种对整个批次的属性都取统一值的单个值,它是不变的,通常设置完Uniform值就紧接着发出一个图元批次的命令。Uniform值可以无次数限制使用,可用于整个表面的单个颜色值,也可以设置一个时间值,在每次渲染某种类型的顶点动画时修改它。常用于顶点渲染中设置变换矩阵。
- Uniform值可以是浮点值、整数或布尔值,顶点着色器和片元着色器都可以有Uniform值。
- Uniform值可以是标量类型、矢量类型和矩阵类型。
纹理
- 在顶点着色器、片元着色器中都可以对纹理数据进行采样和筛选。
- 纹理数据,不仅仅是表现图形。很多图形文件格式都是以无符号字节(每个颜色通道8位)形式对颜色分量进行存储的,但仍然可以设置浮点纹理。
输出
- 上图中第四种数据类型是输出(out)。输出数据是作为一个阶段着色器的输出定义的,而在后续阶段的着色器则作为输入定义。
- 输出类型的数据可以简单的从一个阶段传递到下一个阶段,也可以用不同的方式插入。
- 客户端的代码接触不到这些内部变量所以我们的OpenGL开发用不到。
网友评论