栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

渲染流水线

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

渲染流水线

渲染流水线
  • 渲染流水线
    • 1.应用阶段(CPU)
    • 2.几何阶段(GPU)
    • 3.光栅化阶段(GPU)
    • 4.逐片元操作
  • 后处理
  • 显示器

渲染流水线

渲染流水线是从CPU到GPU到显示器的过程。
基本上分为:应用阶段、几何阶段、光栅化阶段。
细分为:顶点数据、顶点着色器、光栅化、片段着色器、 alpha 测试、模板测试、深度测试、 blend、gbuffer、frontBuffer、frameBuffer、显示器

1.应用阶段(CPU)

MeshRender从CPU将Mesh传递给GPU,粗粒度剔除,进行渲染设置,准备基本数据,输出到几何阶段。
Mesh:包含顶点、三角面、UV(texture映射)

  1. 准备基本的场景数据,将数据加载到缓存上

     物体变换的数据:坐标、旋转、缩放
     物体网格的数据:顶点坐标、uv贴图
     摄像机数据:坐标、方向、远近裁剪平面、正交、透视投影(FOV),视口比例、尺寸
     光源的类型:方向光、点光源、聚光灯(光源类型影响光照衰减),坐标、方向、角度
     其他全局参数
    
  2. 设置渲染的状态 (渲染目标,渲染顺序等)

     绘制设置:使用着色器、物体合批处理
     绘制顺序(由远到近,先渲染不透明的或者半透明的):相对摄像机的距离、深度,材质RanderQueue(渲染队列),UICanvas,其他
     渲染目标(结果输出到哪里):FrameBuffer(帧缓存),Rander Texture
     渲染模式(前向、延迟渲染):
     	前向
     	* 遍历1000个三角形片元
     	* 进行深度检测,没通过的忽略
     	* 通过检测的进行光照计算
     	* 更新帧缓冲区
     	* 返回1继续直到遍历结束
     	延迟渲染
     	* 遍历1000个三角形片元
     	* 进行深度检测,没通过的忽略
     	* 通过的将坐标、光照等信息写入GBuffer
     	* 返回1继续直到遍历结束
     	* 遍历GBuffer
     	* 利用GBuffer中的数据进行光照计算
     	* 更新帧缓冲区
     	* 返回5继续直到遍历结束
    
  3. 调用DrawCall,相同mesh、material合批成一个dc,DrawCall越多Cpu性能越可能达到瓶颈

2.几何阶段(GPU)
	几何阶段的输入数据是应用阶段的输出数据,在几何阶段中,首先在顶点着色器里,我们可能需要计算顶点光照,
在计算顶点光照的时候就需要知道光源的位置和朝向以及摄像机的位置和朝向,还有当前顶点的世界位置。曲面
细分着色器可以通过现有的顶点来生成更多的顶点,所以也需要知道现有顶点在模型里的位置信息,结合着色器,
休要通过现有的图元来做一些几何方面的操作,生成更多的顶点和图元,比如对现有图源所在的平面生成法线,
	那么同样需要知道现有图源的顶点位置,同样的几何阶段要为光栅化阶段准备数据。
顶点裁剪,裁剪摄像头内看不到的顶点,屏幕映射,把顶点位置从3D空间坐标转换到2D空间坐标,这就是屏幕映
射。
  1. 顶点着色器(进行矩阵的变换)

     计算顶点位置、颜色,实现顶点的空间变换等功能。
    
  2. 曲面细分着色器

     用于细分图元
    
  3. 几何着色器

     用于执行逐图元的着色操作,或者被用于产生更多的图元。
    
  4. 投影

     这一步是GPU自动完成的,它分为正交和透视两种。到这就完成了一个顶点空间到投影空间的过程。
    
  5. 裁剪(不同的投影方式)

     分为视锥体裁剪,正面或者背面剔除,这一步是可以配置的。即我们在shader的里边可以通过一些代码设置它的开关。
    
  6. 屏幕映射

     负责把每个图元的坐标转换到屏幕坐标系中
     坐标系差异化(OpenGL、DX)
    
3.光栅化阶段(GPU)
		将顶点变成像素,在光栅化阶段,拿到映射到2D空间里的顶点位置,我们要把它组装成三角形,这就是三角形
	设置,还要知道三角形包含了哪些2D空间的像素点,这就是三角形遍历,最后我们要对这些点使用他们包含的
	数据来着色,并且为后面的逐片元着色准备数据。
		光栅化阶段还有可能会做一件事情,抗锯齿,抗锯齿的方式有很多种(SSAA / MSAA / FXAA / TXAA),他们实
	现的原理各不相同
		SSAA是将渲染的分辨率放大,比如我们说的屏幕分辨率 1024 * 1024,渲染输出的 buffer,他的分辨率可以设
	置成 2048 * 2048,这样相当于我们会渲染到一个放大四倍的 buffer 上,然后对 buffer 进行下采样,再输
	出到屏幕
		FXAA / TXAA 是后处理操作,不在当前光栅化阶段
		只有MSAA发生在光栅化阶段,MSAA 会对每个像素设置多个子采样点,然后对每个子采样点进行覆盖测试和
	遮挡测试


	并行计算:一次性能计算多少个顶点(带宽)
	顶点着色器计算2x2次,片段着色器对应计算100x100次(当2个顶点对应100像素时)
	能放在顶点着色器计算的东西尽量放这,不要放入片段着色器。
4.逐片元操作

光栅化结果之后,会得到编号的片元,到这一步对片元进行着色

  1. 片元着色器(获得颜色值,根据三角形三个顶点的颜色进行线性插值)

     	像素:RGBA四通道。RGBA8888、RGBA4444、RGB565(每个通道占bit位)
     	1字节=8比特
     	RGBA8888:4(字节)* 1024*1024 ==   4 ?M
     	计算像素的颜色,跟灯光计算,纹理采样
    
     	切线空间下法线每个坐标轴的取值范围是在(-1,1)。而存储为法线纹理图片的颜色取值范围
     是在(0,1)之间,需要通过(normal + 1)/ 2,将取值范围从(-1,1)映射到(0,1)。而
     模型的法线方向大部分是相同的,即Z 
     	方向(0,0,1),映射到图片颜色空间是(0.5, 0.5,1)呈蓝紫色
    
  2. 颜色混合
    一个片元可能覆盖多个像素,所以要对这些像素继续测试,丢弃掉一些不合格的像素。
    2.1. Alpha Test

     丢弃掉透明的物体的像素。
    

    2.2. Stencil Test

     按照自定义的方式丢弃掉像素。
     想要两个立方体的描边值,不想让任何一个立方体的描边挡住其他的立方体。
     可以把两个立方体的顶点放大,然后绘制成描边的颜色,写入模板缓存里面,在进行真实的立方体绘制中,
     会把立方体的模板值与之前的描边模板值比较,如果这个模板值是描边模板值就把它覆盖掉,这样就能保
     证立方体拥有在描边之上。
    

    2.3. Depth Buffer Test

     深度测试的顺序是按照Pass Tags里面的Queque来进行排序的,如果Queue的数值是一样的,则从远到
     近进行排序。
     谁离相机进谁能显示出来。
    

    什么叫深度?


    什么是深度缓存?

    什么是深度测试?

     根据深度缓存区里面的值和即将渲染的物体的深度值进行对比。
     不透明物体先渲染距离相机近的物体,后渲染远的物体;透明物体先渲染距离相机远的物体,后渲染近的物体
    

    2.4. Blend

     即将渲染的物体的像素和已经渲染到屏幕上的像素做融合。
    
  3. Gbuffer

     最终要显示的像素都存这。RGBA像素、深度信息、模板信息
     Float =4字节=4x8bit
     每个相机包含:
     	RGBA像素:Float[ 1920*1080(分辨率)] [0] 
     	深度信息:Byte[1920*1080] [0]
     	模板信息:Byte[1920*1080][0]
    
  4. FrontBuffer

     float[1920*1080]
    
  5. FrontBuffer

     float[1920*1080]
    
后处理 显示器
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号