OpenGL基础渲染

OpenGL基础图形管线

OpenGL渲染一个三角形的渲染管线的简化版本如上图所示。

Client/Server

在上图中,管线被分为了两个部分:Client和Server。

  • Client

Client包括了应用程序的代码以及OpenGLAPI等等,主要运行环境是在CPU当中,Client不断地将数据块和命令块组合在一起,发送到Server执行。

  • Server

Client经过处理之后产生的数据会通过驱动程序发送到Server当中,同时Server会执行传送过来的内容。主要是指GPU和显卡。

ClientServer是异步的过程,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

回到顶部