想要学习OpenGL的渲染思想,就需要了解OpenGL中,图片是怎么渲染到我们所看到的屏幕上的,这个流程是需要知道的,这篇文章,我们就来聊聊OpenGL的渲染流程。文中部分内容来自:
着色器的渲染流程
在聊OpenGL渲染架构之前,我们先来了解一下着色器的整个渲染流程,着色器的渲染流程图如下所示:
图片的渲染流程
在来说说图片渲染流程,一张图片的渲染架构流程图如下:
通过上面的2张渲染流程图,我们可以大致了解到图形图像从数据产生到渲染到屏幕上给我们看到的一个管线的经过关系,接下来,我们着重了解一下OpenGL的渲染流程。
OpenGL渲染管线流程
先看下OpenGL渲染管线的架构图示如下:
对于OpenGL开发者来说,这张图的掌握非常重要,看似很简单的一张架构图,其实对于后期来说很重要,一定要多看看这张图,在后面的学习中,我们在处理图形的渲染,都会依据上面这张图进行编写程序。
--
客户端和服务端
根据架构图所示,我们的渲染管线分为上下2个部分,上面部分是客户端,下面部分是服务端。
- 客户端是存储在CPU存储器中的,并且在应用程序中执行,或者在主系统内存的驱动程序中执行。驱动程序会将渲染命令和数组组合起来,发送给服务器执行!(在一台典型的个人计算机上,服务器就是实际上就是图形加速卡上的硬件和内存)
- 服务器 和 客户机在功能上也是异步的。 它们是各自独立的软件块或硬件块。我们是希望它们2个端都尽量在不停的工作。客户端不断的把数据块和命令块组合在一起输送到缓冲区,然后缓冲区就会发送到服务器执行。
- 如果服务器停止工作等待客户机,或者客户机停止工作来等待服务器做好接受更多的命令和准备,我们把这种情况成为管线停滞
--
VBO/VAO(顶点缓冲区对象/顶点数组对象)
VBO/VAO
是CPU提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。
--
VertexShader(顶点着色器)
- 顶点着色器是一个可编程的处理单元,功能为执行顶点的变换,光照,材质的应用于计算等顶点的相关操作。工作过程为首先将原始的顶点几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标,颜色,点位置等后继流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。
- 顶点着色器的输入主要为待处理顶点相应的attribute变量,uniform变量,采样器以及临时变量或纹理数据;输出主要为经过顶点着色器生成的varying变量及一些内建输出变量。
- 顶点着色器的输入数据由下面组成:
-- Attributes:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点位置、颜色等。
-- Uniforms:顶点着色器使用的常量数据,不能被着色器修改,一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置。
-- Texture Data:这个是可选的,表示顶点着色器使用的纹理。
--
PrimitiveAssembly(图元装配)
- 顶点着色器之后,渲染管线的下一个阶段是图元装配,图元是一个能用OpenGL绘图命令绘制的几何体,绘图命令指定了一组顶点属性,描述了图元的集合形状和图元类型。顶点着色器使用这些顶点属性计算顶点的位置,颜色以及纹理坐标,这样才能传到片元着色器。
- 这个阶段主要有两个任务,一个是图元组装,另一个是图元处理。
-- 图元组装是指顶点数据根据设置的绘制方式被结合成完整的图元,例如,点绘制方式下仅需要一个单独的顶点,每个顶点为一个图元;线段绘制方式则需要两个顶点,每两个顶点构成一个图元。
-- 图元处理最重要的工作是剪裁,对于每个图元,必须确定它是否位于视椎体内(3维空间显示在屏幕上的可见区域),如果图元部分在视椎体中,需要进行裁剪,如果图元全部在视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。背面剔除操作也会执行,它根据图元是正面还是背面,如果是背面则丢弃该图元。经过裁剪和背面剔除操作后,就进入渲染流水线的下一个阶段:光栅化。
--
Rasterization(光栅化)
光栅化是将图元转化为一组二维片段的过程,然后,这些片段由片段着色器处理(片段着色器的输入)。这些二维片段代表着可在屏幕上绘制的像素。用于从分配给每个图元顶点的顶点着色器输出生成每个片段值的机制称作插值(Interpolation)。这句不是人话的话解释了一个问题,就是从cpu提供的分散的顶点信息是如何变成屏幕上密集的像素的,图元装配后顶点可以理解成变为图形,光栅化时可以根据图形的形状,插值出那个图形区域的像素(纹理坐标v_texCoord、颜色等信息)。注意,此时的像素并不是屏幕上的像素,是不带有颜色的。接下来的片段着色器完成上色的工作。
--
FragmentShader(片元着色器)
片元着色器是用于处理片元值及相关数据的可编程单元,其可以执行纹理的采样,颜色的汇总,计算雾颜色等操作。片元着色器主要功能为通过重复执行(每片元一次)将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后继阶段;
片元着色器对光栅化阶段产生的每个片元进行操作,需要的输入数据如下:
- 顶点着色器输出的varying变量经过光栅化插值计算后产生的作用于每个片元的值。
- Uniforms:片元着色器使用的常量数据。
- Texture Data:表示片元着色器使用的纹理数据。
--
总结:以上就是对OpenGL渲染管线流程的解析说明,我们在编程的手,多看看,记住这个图就可以进行编程了。
--
系列连载
OpenGL入门(一)-- 图形API简介与作用
OpenGL入门(二)-- 快速了解OpenGL下的专业名词
OpenGL入门(三)-- OpenGL坐标系解析与坐标变换
OpenGL入门(四)-- OpenGL坐标系与坐标变换
OpenGL入门(五)-- OpenGL渲染流程图解析
OpenGL入门(六)-- OpenGL 固定存储着色器的理解使用
OpenGL入门(七)-- 图形图像渲染中的深度缓冲区
OpenGL入门(八)-- OpenGL向量和矩阵简介
OpenGL入门(九)-- OpenGL 纹理简单介绍