OpenGL基础(二) 渲染流程图解析
前言
最近在学习视图渲染的东西,就从OpenGL入门了,因之前对渲染知识了解的不多,咱还是果断从最基础的搞起。零基础的推荐大家看《OpenGL超级宝典》--蓝宝书。讲的非常细致,容易理解。学习过程我会记录一些心得体会和总结,也希望这些能够帮助到正在入坑的童鞋。
一、OpenGL的渲染流程
OpenGL中的渲染是按照设计好的流程进行的。从最原始的顶点数据到显示出最终的效果需要按照一定的顺序来进行。那么接下来我们就来了解一下GPU拿到顶点数据后是如何处理的,如下图所示:
OpenGL渲染流程1、顶点着色器(必要):对顶点数据进行变换(平移、旋转、投影)、光照等逐个计算。
2、细分着色器(可选):描述物体形状,在管线中生成新的几何体处理模型。
3、几何着色器(可选):对顶点数据进行加工,通过高效的几何运算,将数据输出到片段着色器。
4、图元设置:即将顶点根据primitive(原始的连接关系)还原成网格结构。网格由顶点和索引组成,在之前流水线中是对顶点的处理,在这个阶段是根据索引将顶点连接在一起,组成线、面单元。
5、剪切:剪切视口之外的视图,没有超出边界则不需要剪切。
6、光栅化:计算并确定图元所覆盖的区域像素片元。
7、片元着色器(必要):对每个像素点颜色计算和填充。
8、将处理好的frameBuffer 放到帧缓冲区,有视频控制器将数据显示到屏幕上。
二、OpenGL 渲染架构
OpenGL渲染需要按照流程办事,那么开发者是如何介入到这个流程中的,在那个环节介入呢?
OpenGL渲染架构图1、客户端、服务端
在这个图中,管线分为两部分,上半部分为客户端,下半部分为服务端。就 OpenGL 而言,客户端是存储在 CPU 存储器中的,驱动程序将渲染命令与数据组合起来发给服务器执行。驱动程序会将渲染命令和数组组合起来,发送给服务器执行!在一台典型的个人计算机上,服务器就是实际上就是图形加速卡上的硬件和内存
服务器 和 客户机在功能上也是异步的。 它们是各自独立的软件块或硬件块。我们是希望它们2个端都尽量在不停的工作。客户端不断的把数据块和命令块组合在一起输送到缓冲区,然后缓冲区就会发送到服务器执行。
2、attributes属性、uniform值、纹理、输出
Attributes 属性(只能传递到顶点着色器,不能传递到片元着色器):一个顶点要做改变的数据元素。属性可以是浮点数,整数、布尔数据。比如:颜色数据、顶点数据、纹理坐标、光照法线等。
Uniform值(可以直接传递到顶点着色器/片元着色器):通过设置 Uniform 变量就紧接着发送一个图元批次处理命令。Uniform 变量实际上可以无限次的使⽤。 设置一个应用于整个表⾯面的单个颜色值,还可也是一个时间值。如果是每个顶点需要发生的旋转等变换,可以使用uniform传递到顶点着色器;如果是需要对视频的图片进行颜色空间转换:YUV-->RGB,会使用uniform传递到片元着色器。
纹理数据(可以直接传递到顶点着色器/片元着色器):典型的应用场景:片段着色器对一个纹理值进行采样,然后在一个三角形表面应用渲染纹理数据。纹理数据,不仅仅表现在图形,很多图形文件格式都是以无符号字节(每个颜色通道8位)形式对颜色分量进行存储的。
输出:在图表中第四种数据类型是输出(out);输出数据是作为一个阶段着色器的输出定义的,而后续阶段的着色器则作为输入定义。输出数据可以简单的从一个阶段传递到下一个阶段,也可以用不同的方式插入。客户端的代码接触不到这些内部变量我们的OpenGL开发暂时接触不到。
参考资料:
1、OpenGL 4.0的Tessellation Shader(细分曲面着色器)
2、几何着色器
OpenGL渲染流程详解OpenGL渲染流程详解