找回密码
 立即注册
查看: 324|回复: 0

Unity渲染管线笔记

[复制链接]
发表于 2022-4-25 15:11 | 显示全部楼层 |阅读模式
前言:这玩意学了两年总是学了忘忘了学,趁最近铁了心重新入一次坑,学完之后整理一下知识点,方便自己巩固一下知识。可能有些地方没理解到位,欢迎指正。
渲染是什么

渲染分为离线渲染和实时渲染,离线渲染一般用于电影领域。游戏内画面的渲染属于实时渲染。
Shader是什么

运行在GPU上的一段可编程程序
渲染管线

渲染管线是什么     需要渲染的数据资源→渲染管线→RenderTarget
渲染管线一般是指在一帧图像绘制时,CPU把渲染所需要的数据(模型参数、材质参数、贴图等等的)发送给渲染管线之后,渲染管线通过一系列流水线的操作,把前面的数据转化成2D图像的一条工序
Unity的 Build-in 渲染管线

三个阶段 应用阶段(CPU)→几何阶段(GPU)→光栅化阶段(GPU)
应用阶段


  • 摄像机调用Render函数,开始一道传染流水线。
  • 剔除阶段

    • 视椎体剔除 :把在摄像机视椎体外的模型(摄像机不会拍摄到的物体)进行AABB包围盒碰撞检测,若不在拍摄范围内,则进行剔除。
    • 层级剔除:根据模型所设置的层级,进行层级的筛选,剔除掉不渲染的层级物体。
    • 遮挡剔除:还不是特别熟悉,先忽略,准备后续专门针对该技术进行文章补充。

  • 渲染排序:把需要渲染的物体按距离、渲染队列等规则进行排序,按排序后的顺序把数据提交给GPU阶段。

    • Unity的渲染排序通过 渲染队列 RenderQueue 进行控制
    • 不透明队列(RenderQueue < 2500) 根据摄像机的距离从前到后排序
    • 透明队列(RenderQueue > 2500) 根据摄像机的距离从后到前排序

  • 打包数据:把模型的顶点数据、使用的shader已经参数统一打包。

    • 模型信息:顶点坐标、法线、UV、切线、顶点颜色、索引列表
    • 变换矩阵:

      • 世界变换矩阵
      • VP矩阵:根据摄像机位置构
      • 最后通过 MVP 矩阵,可以从顶点着色器把模型顶点从模型空间转换到裁剪空间的坐标。

    • 灯光、材质参数:shader、材质信息、灯光信息等等。

  • 调用 SetPass 以及 DrawCall 把打包好的数据发送给GPU,并通知GPU流水线开始工作。
几何阶段(GPU)


  • 收到CPU发送过来的相关数据。
  • 顶点着色器
    主要作用:顶点着色器的作用主要是把模型空间的顶点坐标转换为裁剪空间的坐标。使后续的阶段可以拿到裁剪空间的坐标进行视口转换。
  • 几何曲面细分着色器(可以通过适用的细分算法,生成高精度的网格顶点,还不是很深入的了解~~)
  • 几何阶段图元装配(硬件阶段)

    • 裁剪操作:在裁剪空间中,如果一个三角面与视椎体有交界的部分会重新生成一个在视椎体内的新三角面
    • NDC标准化设备坐标(把顶点数据进行透视除法,转换成NDC标准化设备坐标),把裁剪空间的顶点坐标缩放到 -1 到1 之间。
    • 背面剔除:可通过代码控制,如果开启背面剔除的话,则会把每个三角面进行判断是否,如果是三角正面对着摄像机则不剔除,否则则剔除。
    • 进行视口转换,把NDC标准化设备坐标转换成屏幕坐标。(这里的转化主要针对的是XY坐标,Z值在后续光栅化操作中,会转化为片元的深度信息)
    • 图元装配:把前面准备的所有三角形点连成线,通过 三角形设置→三角形遍历 ,生成的三角形叫做图元

光栅化以及片元着色器(GPU)


  • 对每个图元进行线性插值的算法,生成片元。提供给后续的片元着色器。
  • 片元着色器(可自定义代码):通过拿到上面生成的片元数据,对每个片元进行着色逻辑的处理。(光照计算、纹理技术)
合并输出阶段

获取到片元着色器输出的片元信息,会根据一系列检测,判断该片元能否输出到帧缓冲区,(FrameBuffer),并且根据设置的混合参数,将输出的片元与 帧缓冲区 的片元信息进行混合处理。
帧缓冲区实际上有三个缓冲区组成: Color 缓冲区,Depth 深度缓冲区, Stencil 模板缓冲区。

  • 收到片元数据
  • Alpha测试:透明度测试,alpha 值 < 0 则把片元抛弃,通过则按照设置的混合参数,把自身的 Color 与 Color缓冲区的 Color 进行混合,并且把新的颜色存入颜色缓冲区。
  • 模板测试:Stencil Test ,通过一系列的模板数值配置与比较操作配置,把片元自身的模板值与模板缓冲区的模板值进行比较,若通过比较,则按照模板测试的配置,把值写到模板缓冲区。
  • 深度测试:Depth Test , 与模板测试类似,不过这里比较的是深度。
  • 颜色混合阶段,把通过测试的片元携带的颜色值按照混合设置,把颜色设置到颜色缓冲区。
最后colorbuffer由显存发送到显示器
后处理

还没有仔细研究,留个坑,后续补上,不过大概觉得是类似PS一样,从帧缓冲区获取到当前得到的图像之后,再把这张图像跑一次后处理相关的渲染管线,得到一张新的图放到帧缓冲区中。(大概)
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 13:38 , Processed in 0.115510 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表