OpenGL基础渲染
OpenGL基础图形管线
OpenGL
渲染一个三角形的渲染管线的简化版本如上图所示。
Client/Server
在上图中,管线被分为了两个部分:Client和Server。
- Client
Client
包括了应用程序的代码以及OpenGL
的API
等等,主要运行环境是在CPU
当中,Client
不断地将数据块和命令块组合在一起,发送到Server
执行。
- Server
Client
经过处理之后产生的数据会通过驱动程序发送到Server
当中,同时Server
会执行传送过来的内容。主要是指GPU
和显卡。
Client
和Server
是异步的过程,Server
在处理数据的同时,Client
会准备下一次将要发送给Server
的数据,这样可以保证最大的性能。
着色器
在上图中,还包含了两个着色器:顶点着色器和片元着色器。
- 顶点着色器
顶点着色器处理了从Client(CPU)
传入的数据,应用变换,或者进行其他类型的数学运算来计算光照效果、位移、颜色值等。实例中三角形有三个顶点,因此顶点着色器将会执行三次。由于GPU
的特型,这三次处理都可以同时进行。
顶点着色器处理过的顶点经过Primitive Assembly(图元装配)
以及光栅化之后将作为输入传递到片元着色器中。
片元着色器
片元着色器将经过光栅化之后的片元进行填充,片元着色器会输出我们在屏幕上看到的最终颜色值。同理,片元着色器的填充操作也是并行计算的。
渲染数据的传递方式
向OpenGL
着色器传递渲染数据的方法有三种:
1. 属性
属性就是一个对每个顶点都要做改变的数据元素。
- 顶点位置本身就是一个属性。
- 属性值可以是浮点数、整数或者布尔数据。
- 属性是以四维向量的形式进行内部存储的
(x,y,z,w)
。 - 纹理坐标、颜色值和用于光照计算的表面法线也属于属性。
- 属性会从
CPU
内存中复制到GPU
显存中,供顶点着色器使用。
2. Uniform
Uniform
是一种对于整个批次的属性都取统一值的单个值,是不经常变化的。- 通常设置完
Uniform
变量就紧接着发出渲染一个图元批次的命令。 - 实际上可以被无次数限制的使用。
- 可以设置一个应用于整个表面的单色值,还可以设置一个时间值,在每次渲染某种类型的顶点动画时修改(注意:这里的Uniform变量在每个批次改变一次,不是每个顶点改变一次)
Uniform
也可以是浮点数、整数或者布尔数据,既可以是标量类型,也可以使矢量类型,也可以使用Uniform
矩阵。- 顶点着色器和片元着色器中都可以有
Uniform
。
3. 纹理
顶点着色器和片元着色器都可以对纹理值进行采样和筛选。片元着色器对纹理进行采样,并在三角形的表面上应用图形数据。
纹理数据不仅仅是表现图形,很多图形格式都是以无符号字节(每个颜色通道8位)形式对颜色分量进行存储的,但是我们仍然可以设置浮点纹理。这就是说,任何大型浮点数据块(例如消耗资源很大的函数的大型查询表)都可以通过这种方式传递给着色器。
输入/输出
输出数据是作为一个阶段着色器的输出out
定义的,在后续阶段的着色器则是作为输入in
定义的。输出类型的数据可以简单的从一个阶段传递到下一个阶段,也可以以不同的方式插入。顶点着色器为输出变量分配一个值,这个值是常量,也可以在图元被光栅化时插入到顶点之间,片元着色器对应的同名输入值接收这个常量或插入值。
以上是 OpenGL基础渲染 的全部内容, 来源链接: utcz.com/a/30712.html