Shader和3D图形渲染管线(Render Pipeline)
最近在系统学习Shader,发现编写之前需要对渲染绘图管线流程有一个系统的认知才能学的更加深刻
网上查了一篇教程发现内容并不是很多,本文将自己学习的内容以尽可能的简单易懂的方式记录下来并分享给大家
大家也可以关注我的博客,可以和我一起学习Shader编程和Unity3d游戏开发。
开始本文的学习!!!
定义
渲染管线也称渲染流水线,是显示芯片内部处理图形信号相互独立的并行的处理单位。
一个流水线是一序列可以并行和按固定顺序进行的阶段。
也就是说每个阶段都是从它的前一阶段输入,然后输出发给随后的阶段。
渲染流程
渲染管线流程就是是输入3D模型,输出2D片显示出来的过程
渲染管线流程可以细分为以下4个阶段
·顶点处理
通过一系列的坐标转换,将模型的顶点在摄像机前进行位移,并最终投影到摄像机的投影屏幕上
其中的空间位置转化过程为:本地坐标系->世界坐标系->观察坐标系->投影坐标系
顶点处理这个阶段包括顶点的坐标变换、逐顶点雾化、材质属性、光照属性处理
·面处理
面处理也叫图元处理。
这一阶段主要包括面的组装、面的截取、面的剔除
·光栅化
将以向量为基本结构的面转换为一个个点阵形式的像素
·像素处理
这一阶段包括对每个像素区域进行着色、对像素贴上贴图、形成最终的画面(输入像素的位置、深度、贴图坐标、法线、切点、颜色等;输出每个像素的颜色和透明度)
CPU与GPU的分工
CPU在内存中建立以下资源
·顶点定义
·顶点缓存
·索引缓存
·贴图
·摄像机
·投影
CPU从内存中发送以下资源到显存中供GPU使用
·顶点定义
·顶点缓存
·索引缓存
·贴图
·坐标系变换矩阵
·渲染状态
·贴图采样方式
Shader定义
Shader中文的翻译是着色器,是一种较为短小的程序片段,用于告诉图形硬件如何加速输出图像,过去是有汇编语言来编写。
总而来说,Shader是可编程图形管线的算法片段
主要分为:Vertex Shader和Fragment Shader
Shader与渲染流水线的关系
由上图易发现,着色器是穿插在渲染流水线上的一段算法程序,它负责将输入的顶点数据以指定的方式和输入的贴图或者颜色等组合起来,然后输出。
Shader和材质、贴图的关系
Shader将顶点数据以指定的方式和贴图或者颜色组合起来,将输出数据绘制到屏幕上。
材质就是将Shader以及输入参数(包括贴图)打包存储起来,将材质赋予到三维物体上进行渲染
这样就是说材质就是引擎最终使用的商品(每个渲染的物体都需要一个材质)
Shader就是生产这种商品的加工过程或方法,贴图就是商品材料之一。