• 【图形学】29 更复杂的光照


    来源:《UNITY SHADER入门精要》

    1、渲染路径

      我们如果要在 Shader 中计算光源,我们需要为每一个 Pass 指定它所使用的渲染路径,这样才能访问到特定内置变量存储的光源信息。
      Unity中目前保有 4 种渲染路径:

    1、Deferred Shading Rendering Path(延迟渲染)
    2、Forward Rendering Path(前向渲染)
    3、Lagacy Deferred Lighting Rendering Path(遗留的延迟光照)
    4、Vertex Lit Rendering Path(顶点光照)

    2、针对整个项目渲染路径的改变

      我使用的是 Unity 2021.3.4f1c1 版本,俺已经找不到全局和摄像机RendingPath的设置位置了。

    3、Unity支持的渲染路径

      对于每个 Pass 的 LightMode 标签,Unity 支持以下的渲染路径设置:
    在这里插入图片描述

    4、前向渲染(Forward Rendering Path)

    ①每次渲染的过程

      每一次完整的前向渲染,我们需要 ①渲染该对象的渲染图元②计算颜色缓冲区③计算深度缓冲区。而且,对于每一个不同的光源,我们都要进行一次 Pass 渲染。
      如果场景中有 N 个物体,每个物体受 M 个光源影响,那么整个场景里一共需要 N* M 次 Pass 来完成渲染。
      Unity 中,如果存在多个光源的话,Unity会按照距离、强度和颜色来分配重要程度,具体如何自动分配重要程度的,Unity 官方文档中没有给出说明,当然也可以手动设置 重要程度。

    ②多个光源的渲染方法

    在这里插入图片描述

      这里说的 SH(Spherical harmonics 球谐函数)是一种更简单的渲染方式。
      对于 Render Mode 为 Auto 的光源,Unity将以每像素光照模式渲染(A 到 D),然后最多 4 个光源以每顶点光照模式渲染(D 到 G),最后其余光源以 SH 进行渲染(G 到 H)。
      对于设置成 Important 的光源,会按像素处理。
      对于设置成 Not Important 的光源,会按照逐顶点或 SH 的方式处理。

    ③Unity中渲染光线的Pass

    在这里插入图片描述

    • 对于前向渲染来说,一个Unity Shader通常会定义一个Base Pass(Base Pass也可以定义多次,例如需要双面渲染等情况)以及一个Additional Pass。一个Base Pass仅会执行次(定义了多个Base Pass的情况除外),而一个Additional Pass会根据影响该物体的其他逐像素光源的数目被多次调用,即每个逐像素光源会执行一次Additional Pass。
    • 在Additional Pass 的渲染设置中,我们还开启和设置了混合模式。这是因为,我们希望每个Additional Pass可以与上一次的光照结果在帧缓存中进行叠加,从而得到最终的有多个光照的渲染效果。如果我们没有开启和设置混合模式,那么Additional Pass的渲染结果会覆盖掉之前的渲染结果,看起来就好像该物体只受该光源的影响。通常情况下,我们选择的混合模式是 Blend One One

    ④内置的光照变量和函数

    在这里插入图片描述
    在这里插入图片描述

    5、延迟渲染(Deferred Shading Rendering Path)

    ①概念

      延迟渲染主要包含了两个 Pass。在第一个 Pass 中,我们不进行任何光照计算,而是仅仅计算哪些片元是可见的,这个主要通过深度测试实现,然后进行深度缓冲。当发现一个片元会是可见的,我们就会把相关的信息储存到 G-Buffer 中。然后,在第二个 Pass 中,我们利用 G-Buffer 中各个片元信息,例如:表面发现、视角方向、漫反射系数等,再进行光照计算。
      延迟渲染使用的 Pass 数目通常就是两个,这跟场景中包含的光源数目没有关系。换言之,延迟渲染的效率不依赖于场景的复杂度,而是和我们使用的屏幕空间大小有关。这是因为,我们需要的信息都存储在缓冲区中,而这些缓冲区可以理解成是一张张2D图像,我们的计算实际上就是在这些图像空间中进行的。

    ②延迟渲染的缺点

    • 不支持真正的**抗锯齿(anti-aliasing)**功能。
    • 不能处理半透明物体
    • 对显卡有一定要求,显卡必须支持MRT(Multiple Render Targets)、Shader Mode3.0及以上,深度渲染纹理以及双面的模板缓冲。

    ③延迟渲染的过程

      (1)第一个 Pass 用于渲染 G 缓冲。在这个 Pass 中,我们会把物体的漫反射颜色、高光反射颜色、平滑度、法线、自发光、深度等信息渲染到屏幕空间的 G缓冲区。对于每个物体来说,这个 Pass 仅会执行一次。
      (2)第二个 Pass 用于计算真正的光照模型。会使用上一个Pass中渲染的数据来计算最终的光照颜色,再存储到帧缓冲中。

      默认的 G 缓冲区包含了以下几个渲染纹理(Render Testure,RT):

    • RTO:格式是ARGB32,RGB通道用于存储漫反射颜色,A通道没有被使用。
    • RT1:格式是ARGB32,RGB通道用于存储高光反射颜色,A通道用于存储高光反射的指数部分。
    • RT2:格式是ARGB2101010,RGB通道用于存储法线,A通道没有被使用。
    • RT3:格式是ARGB32(非HDR)或ARGBHalf(HDR),用于存储自发光±lightmap+反射探针(reflection probes)。
    • 深度缓冲和模板缓冲。

    ④Unity延迟渲染中可以使用的内置变量

      可使用的内置变量和函数可以在 UnityDeferred Library.cginc 文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTOFMMtT-1666315044645)(assets/image-20220625163616805.png)]

    6、顶点光照(Vertex Lit Rendering Path)

      旧了,不太使用了。更多比较可以查看官方文档:https://docs.unity3d.com/cn/current/Manual/RenderingPaths.html 。

    7、前向渲染的Unity实现

      如果我们想要修改 Unity前向渲染中的逐像素渲染的个数的话,Edit -> Project Settings -> Quality -> Pixel Light Count,默认是 4。可以自行修改。

  • 相关阅读:
    如何学习能减少对现有工作的依赖?
    第四章:模板引擎
    观察者模式
    pandas学习资源
    mac配置环境变量总结
    时间序列数据可视化:Pyecharts日历图
    抽奖中的分布式锁应用
    Redis 的底层数据结构和IO模型
    力扣十四题. 最长公共前缀
    c++ 学习 之 指针常量 和 常量指针
  • 原文地址:https://blog.csdn.net/qq_40891541/article/details/127439324