Unity中坐标空间的转换:
Unity的渲染流程:
渲染到设备屏幕的每一帧画面都要经历如下几个阶段:
应用程序阶段(CPU):将材质和模型数据发送给GPU
几何阶段(GPU):进行顶点变换计算
光栅化(GPU):将三角形转化为片元,并对片元着色。
Cpu:准备需要渲染的对象。
- 把可视的对象,进行遮挡剔除和视椎体剔除,并将渲染对象排序。
- 设置渲染对象的渲染状态,包括材质,模型,着色器
- 发送drawcall
会为每一个渲染兑现的每一个材质生成一个渲染批次batch,(合批就是将多个材质合成一个批次)
setPass Call是在渲染状态发生改变时才会被调用,和drawcall相伴产生。在某些特定情况也不一定对等,如一个batch中用到了多个pass,不同的pass,cpu将发送新的setpass call和drawcall。而在静态批处理中,由于顶点限制而不能再同一批次处理而被分割的紧邻的多个批次,因为使用的是相同的渲染设置,所以只产生一个set pass call
Setpass call 是告诉gpu接下来要用到哪些资源,需抓经准备。执行时,会向显存中传入大量的资源信息,包括纹理。
Drawcall 是要求gpu根据顶点数据进行绘制
Fbx(里面包含了uv,顶点位置,法线,切线等信息)加载到内存中,通过mesh render 渲染出来
Skindned mesh render : 带蒙皮的骨骼,把物体的顶点,法线,切线等信息传个gpu渲染出来。
Mesh filter:将模型信息传递给gpu
Mesh render :将顶点等渲染信息传递给GPU
Skinned mesh render 和 mesh render 的区别就是,前者用于有蒙皮动画的mesh, 后者用于静态的mesh。
Gpu:
渲染管线: 顶点着色器、光栅化、片段着色器(alpha测试、模板测试、深度测试、blend、gbuffer、brondbuffer,framebuffer)、显示器
顶点着色器:1.计算顶点的颜色;2. 将物体坐标系转换到相机坐标系;
每个顶点执行一次顶点着色器,在此阶段可以进行透视投影,顶点光照,纹理计算,蒙皮。也可以修改顶点位置生成程序式动画,例如模拟风吹草动,碧波荡漾。
光栅化:将顶点转换成像素,一一对应
片段着色器:将顶点围起来的像素着色(运行次数远大于顶点着色器,尽量将运算放在顶点着色器中。例如:quad中四个顶点坐标为((0,0)(0,100)(100,100)(100,0))顶点着色器执行4次,片段着色器执行10000次)
片段着色器中处理的事情:逐片元操作
- 纹理采样 即给Quad赋予贴图或材质球,把纹理像素付给原来的像素,把原来的像素覆盖掉了
-
像素跟灯光进行计算,
- alpha测试:挑选合格的alpha像素显示。(RGBA)
- 模版测试: 像素还可以携带 模板信息 达到条件的模板值会显示出来
- 深度测试:符合条件的(一般是像素距离相机的距离)像素 就通过,不然就丢弃
- 以上三个测试 决定像素能否被显示出来,挑选合格的像素
- Blend:将当前 要 渲染的像素 和 已经渲染出来的像素混合运算
- GBuffer :一个像素 存的(RGBA 模板值 深度值 )等信息,只要是审核通过了以后,Gbuffer做的中转把这些信息传给FrontBuffer(Buffer其实是缓存区)Float[720*1280*4]数组存的信息比较多
- Front Buffer:由Gbuffer往Front Buffer写完以后,Front Buffer推向显示器显示过程中,Front Buffer,此时变成了framebuffer,由Gbuffer往Front Buffer写完以后,FrameBuffer会交换到后面去变成Front Buffer(Float[720*1280])缓存区
- FrameBuffer:Float[720*1280]缓存区
- 其实 Front Buffer和FrameBuffer在交替显示,一帧帧的看着好像在动一样,所以两个是相对的