1.1.Shader渲染流水线_概念
渲染流水线的工作任务在于将三维场景渲染或者生成一张二维图像。需要从一系列的顶点数据、纹理等信息出发,将信息转换成一张图像。通常是由CPU和GPU共同完成的。
1.2.渲染流水线概念
这个是在第二篇中顺带介绍过的渲染流程三阶段,如下
注意:这只是概念阶段,每个阶段本身也是一个流水线,即包含了子流水线。提示 概念,是从Shader渲染流水线 提炼出的概念。所以在网上或书上看到的,会有名称上的差别,并且种类多到眼花,其实不用过于在意这些。
1.3.CPU和GPU的协作流程
接下来就展开的说一下,我会整理一下,有必要会逐个词对应介绍。
对比 渲染流水线概念图 和 CPU和GPU的协作流程图,可以对照着看一下每个阶段的名称和作用。应用阶段也即CPU提供数据资源,几何阶段属于GPU渲染管线,光栅化和帧缓存是不同的阶段,虽然都属于流程的后期。其中
光栅化:光栅化是将几何图元转变为片段(Fragment)的过程,也就是需要让几何图元能在屏幕上显示为像素就需要经过光栅化处理。
光栅化阶段包括两个部分:
1.确定屏幕坐标中的那些区域需要标准图元占用。
2.分配颜色值和深度值到各个区域。
Frame Buffer:帧缓存是图形渲染的偏后一个步骤,帧缓存中储存着用于渲染到屏幕上的像素,下一步输出到屏幕上。
1.4.Unity3D图形渲染完整流水线
那么再细化一下。下面是扩展开的渲染管线。
Unity3D渲染管线:
淡紫色长方形的属于CPU应用阶段范围内。红色长方形属于GPU渲染管线。
CPU:提供数据资源,模型的顶点坐标\法线信息\UV等数据\这些数据其实都是数字和矩阵组成的, CPU应用程序端处理提供。
GPU:渲染流水线处理,也即渲染流水线(Render Pipeline)
Frame Buffer:帧缓存,流渲染成图像的意思,经过流水线处理操作后,最终就可以在屏幕上出现的渲染效果。
淡紫色长方形的属于CPU应用阶段范围内。红色长方形属于GPU渲染管线。
CPU应用阶段
剔除Culling:
a. 视椎体剔除(Frustum Culling)
b. 层级剔除(Layer Culling Mask)、遮挡剔除(Occlusion Culling)等等
排序Sort
渲染队列RenderQueue
a.不透明队列(RenderQueue<2500)、按摄像机距离 从前到后 排序
b.半透明队列(RenderQueue>2500)、按摄像机距离 从后到前 排序
渲染队列在这一篇有介绍。
打包数据Batch
a.模型信息:顶点坐标、法线、UV、切线、顶点色、索引列表
b.变换矩阵、各空间切换矩阵。从模型到世界到相机到裁剪空间。(MVP)
c.灯光信息、材质参数
循环绘制所有物体
a.绘制调用Draw call
b. 传入GPU渲染管线
1.5.GPU渲染流水线
结合代码块用视图介绍一下如下:
顶点着色器:
a. 顶点MVP空间变换(MVP:从模型空间变换到屏幕空间的矩阵简写)
b. 自定义数据。
排序Sort
光栅化
a.裁剪、背面剔除、屏幕坐标
b.图元装配
片元着色
a.光照着色
b.纹理着色
输出合并
a.Alpha测试、深度测试、模版测试、颜色混合
到这里渲染流程全部说明。