网格、材质、着色器和纹理

网格、材质、着色器和纹理

Unity|计算机图形学


@ZYX 写于2021年08月08日

网格、材质、着色器和纹理

综述

Unity 中的渲染采用网格、材质、着色器和纹理。 - 网格(Mesh)是 Unity 的主要图形基元。网格定义了对象的形状。 - 材质(Material) - 通过包含对所用纹理的引用平铺信息颜色色调等来定义表面应使用的渲染方式。 - 材质的可用选项取决于材质使用的着色器。 - 着色器(Shader)是一些包含数学计算和算法的小脚本 - 根据光照输入材质配置来计算每个像素渲染的颜色。 - 纹理(Texture)是位图图像(Bitmap)。 - 材质可包含对纹理的引用,因此材质的着色器可在计算游戏对象的表面颜色时使用纹理。 - 除了游戏对象表面的基本颜色(反照率)之外,纹理还可表示材质表面的许多其他方面,例如其反射率粗糙度

纹理 Meshes

  • Unity 支持三角triangulated四边的多边形quadrangulated polygon网格,因此必须将 Nurbs、Nurms 和 Subdiv 表面转换为多边形
  • Unity自动查找网格使用的纹理
    1. 首先,导入器在与Mesh相同的文件夹中或任何父文件夹中查找名为 Textures 的子文件夹
    2. 如果此过程失败,Unity 将对项目中的所有纹理执行穷尽搜索
      • 缺点是可能有两个或多个同名的纹理

碰撞体

  • 网格碰撞体是使用导入网格数据的组件,可由 Unity 用于环境碰撞。
  • 如果游戏对象正在移动(例如汽车),则无法使用网格碰撞体。必须改用原始碰撞体。此情况下应禁用 Generate Colliders 设置。

网格过滤器 (Mesh Filter)

Properties 属性
  • Mesh
    • Reference to a mesh that will be rendered.
    • The Mesh is located inside your Assets Directory.
Details 详情
  • The Mesh Filter
    1. takes a mesh from your assets
    2. passes it to the Mesh Renderer for rendering on the screen.
  • When importing mesh assets, Unity automatically creates
    • a Skinned Mesh Renderer if the mesh is skinned,
    • or a Mesh Filter along with a Mesh Renderer, if it is not.

网格渲染器 (Mesh Renderer)

  • The Mesh Renderer
    1. takes the geometry from the Mesh Filter
    2. renders it at the position defined by the GameObject’s Transform component.
材质 Materials
  • Mesh Renderer Inspector 中的 Materials 部分列出了 Mesh Renderer 当前使用的所有材质
    • 从软件导入的网格可以使用多种材质,而每个从 3D 建模软件导入的网格可以使用多种材质,而每个子网格(sub-Mesh) 使用列表中的一种材质。使用列表中的一种材质。
    • 如果网格包含的材质多于子网格中的材质,则 Unity 会使用剩余的每个材质逐一渲染最后一个子网格
属性
  • Size 指定 Mesh Renderer 中的 Materials 数量。
  • Element Mesh Renderer 中的 Materials 列表(以数字顺序排列)。第一个元素始终命名为 Element 0。
光照 Lighting
  • Lighting 部分包含的属性用于指定此网格渲染器 (Mesh Renderer) 如何在 Unity 中与光照相互影响。
属性
  • Cast Shadows 指定在合适的光源照射在网格上时网格是否以及如何投射阴影。
    • On 网格将投射阴影。
    • Off 网格不会投射阴影
    • Two Sided 网格从任一侧投射双面阴影。Enlighten(已弃用)和渐进光照贴图 (Progressive Lightmapper) 不支持双面阴影。
    • Shadows Only 网格的阴影可见,但网格本身不可见。
  • Receive Shadows 启用此选项可使网格显示任何投射在网格上的阴影。仅当使用渐进光照贴图Progressive Lightmapper时才支持这个选项。
  • Contribute Global Illumination
    • 选中 可在游戏对象的 Static Editor Flags 中启用 Contribute GI
    • 取消选中 可禁用
    • 具体看Static[https://docs.unity.cn/cn/2019.4/Manual/StaticObjects.html]
  • Receive Global Illumination
    • 设置此渲染器是从光照贴图 lightmaps 还是从 光照探针Light Probes 接收全局光照。
      • Lightmaps
        • 如果 Unity 应从光照贴图为此Renderer收集全局光照数据,请选择此选项。
      • Light Probes
        • Unity在预计算Precomputation期间不会为渲染器计算光照贴图,可减少烘焙时间
    • 仅启用 Contribute Global Illumination 时才可编辑。
    • 如果 Contribute Global Illumination 被禁用,Receive Global Illumination 默认为 Light Probes 设置。
Lightmapping
  • 仅当 Receive Global Illumination 设置为 Lightmaps 时,此部分才可见

着色器 Shader

着色器简介
  • 着色器程序(Shader program),通常称为着色器(Shader),是在GPU上运行的程序。
  • 着色器的类型
    1. 作为图形管线(Graphic Pipeline)一部分的着色器是最常见的着色器类型
      • 它们执行一些计算来确定屏幕上像素的颜色
      • 通常是通过Shader对象使用这种类型的着色器。
    2. 计算着色器 (ComputeShader) 在常规图形管线之外,在 GPU 上执行计算。
    3. 光线追踪着色器执行与光线追踪相关的计算。
  • 术语
    • 着色器或者着色器程序 shader or shader program 在 GPU 上运行的程序。除非另有说明,否则这意味着着色器程序是图形管线的一部分。
    • Shader 对象 Shader 类的一个实例。Shader 对象是着色器程序和其他信息的封装器。
    • ShaderLab 一种用于编写着色器的 Unity 特定语言。
    • Shader Graph 一种无需编写代码即可创建着色器的工具。
    • 着色器资源 shader asset Unity 项目中扩展名为 .shader 的文件。它定义一个 Shader 对象。
    • Shader Graph 资源 Unity 项目中的文件。它定义一个 Shader 对象。

Shader 类

  • 在 Unity 中,当使用的着色器属于 图形管线 的一部分,通常用到 Shader 类的实例
  • Shader对象是Unity 使用着色器程序的特定方式;
    • 它是着色器程序其他信息封装器
    • 它允许您在同一个文件中定义多个着色器程序,并告诉 Unity 如何使用它们。
  • 渲染管线兼容性
    1. 内置渲染管线
    2. 通用渲染管线 (URP)
    3. 高清渲染管线 (HDRP)
    4. 自定义 SRP
  • Shader 对象基础
    • Shader 对象材质共同使用来确定场景的外观。
  • 资源
    • 两种方式创建 Shader 对象
      1. .shader文件 编写代码来创建一个着色器资源 ** 2. Shader Graph
  • 在 Shader 对象内部
    • Shader对象具有嵌套结构
      • = 子着色器(SubShaders) + 通道(Passes)
      • 它将 shader program 组织成 着色器变体(shader variants)
    • 子着色器
      • 将 Shader 对象分成多个部分
        • 分别兼容不同的硬件渲染管线运行时设置
      • 一个子着色器包含:
        • 兼容信息
        • 子着色器标签,这是提供有关子着色器的信息的键值对
        • 一个或多个通道
    • 通道
      • 通道包含:
        • 通道标签,这是提供有关通道的信息的键值对
        • 在运行着色器程序之前更新渲染状态的说明
        • 着色器程序,组织成一个或多个着色器变体
    • 着色器变体(shader variants)
渲染期间的操作顺序
  • 在 Unity 使用 Shader 对象之前
    1. Unity 为 Shader 对象创建一个SubShader列表。
  • 当 Unity 首次使用 Shader 对象渲染几何体时,或者当着色器 LOD 值或活动渲染管道更改时:
    1. 遍历所有Subshader的列表
      • 检查它们以确定它们是否
        1. 与设备硬件兼容
        2. 当前着色器 LOD 值
        3. 与活动渲染管道兼容
      1. 如果包含满足要求的SubShader
      • 它会选择第一个。这是活动的子着色器。
      1. 如果不包含
        1. 选满足硬件要求(不满足 LOD || 渲染管线要求)
        • 如果还没有,就显示错误材质
  • Unity 可以识别使用相同着色器变体的几何体并将其组织成批次实现更高效的渲染。每帧一次
    • 对于每批几何体:
      1. Unity 确定它应该渲染活动子着色器中的哪些通道,以及帧中的哪个点。此行为因渲染管道而异。
      2. 对于它渲染的每个通道:
        1. 如果当前渲染状态与通道中定义的渲染状态不匹配,Unity会根据通道中的定义设置渲染状态
        2. GPU 使用相关的着色器变体渲染几何体。

着色器资源 Shader Asset

  • 着色器资源是Unity 项目中的资源
    • 它定义 Shader 对象
    • 是一个 .shader 文本文件。
    • 包含着色器代码。
创建新的着色器资源
Assets > Create > Shader
Inspector 参考
  • 使用 Compile and show code 弹出菜单可以
    • 为选定的图形 API 手动编译所有shader variant
    • 面向所选平台检查已编译的着色器代码
      • 优化性能时非常有用 -> 生成了多少低级指令
        • GPU着色器性能分析工具(如 AMD GPU ShaderAnalyzerPVRShaderEditor)中

着色器编译

TODO

内置着色器

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
标准着色器 T F 可以在导入时将标准着色器转换为等效着色器 F 可以在导入时将标准着色器转换为等效着色器 F
标准粒子着色器 T F F F
旧版着色器 T T 简单的无光照旧版着色器可能会渲染得很好,但与 SRP Batcher 不兼容。 T 简单的无光照旧版着色器可能会渲染得很好,但可能与 SRP Batcher 不兼容。 不支持任何 HDRP 功能。 对于支持 HDRP 功能的无光照着色器,请使用 HDRP/无光照着色器。 是 简单的无光照旧版着色器可能会渲染得很好,但它们可能与 SRP Batcher 不兼容。
URP 预构建着色器 F T F F
HDRP 预构建着色器 F F T F

标准着色器 Standard Shader

  • Unity 标准着色器是一个包含一整套功能的内置着色器
    • 可用于渲染“真实世界”的对象
      • 只需在编辑器中使用或不使用各种纹理字段和参数即可启用或禁用此着色器的功能。
    • 还包含一种称为 基于物理着色 (Physically Based Shading PBS)高级光照模型
      • 以一种仿实的方式模拟材质光照之间的相互作用
  • 物理着色背后的理念
    • 物理学原理
      • 能量守恒 energy conservation 反射的光不多于接受的光
      • 菲涅耳反射 Fresnel reflections 所有表面在掠射角处具有更高的反射率
      • 表面如何遮挡自身(所谓的几何术语)等等
  • 数学公式
    • the Disney model for diffuse component,
    • GGX model for specular
      • with Smith Joint GGX visibility term and Schlick Fresnel appromixation
术语
  • 能量守恒 (Energy conservation)
    • 物理学概念
    • 材质的镜面反射越强,其漫射就应该越弱;表面越平滑,高光越强且高光面积越小
  • 高动态范围 (High Dynamic Range, HDR) https://docs.unity.cn/cn/2020.3/Manual/HDR.html
    • 这是指超出常规 0–1 范围的颜色 例如,太阳很容易比蓝天亮十倍
内容 Content 和 上下文 Context
  • 内容(光照和渲染的对象)和上下文(场景中会影响光照对象的光照)
  • 上下文 Context
    • 场景中光源
      • 直接光源:放置在场景中的GameObject光源
      • 间接光源: 例如反射和反射光
天空盒
  • 天空盒(烘焙Baked或程序化Procedural天空盒)可作为光照设置的组成部分
    • 程序化天空 Procedural Skybox 盒还允许直接设置颜色并创建太阳圆盘而不是使用位图
  • 反射探针 ReflectionProbe
    • 虽然反射天空盒非常有用,但通常情况下还需要改变对象使用的反射
    • 允许您在场景中某个空间点进行环境采样,从而将其用作该点附近的所有对象的环境光和反射源
全局光照 Global Illumination GI
  • GI 系统负责创建和跟踪
    • 反射光
    • 发光材质发出的光
    • 环境光
  • 标准着色器和 Unity 的 GI 系统都经过精心设计,可以很好地相互配合。
内容 Content
  • 场景中正在渲染的对象
    • 外观是光照上下文作用于已应用到对象的材质的结果。
Metallic 与 Specular 工作流程的比较
  • 使用标准着色器创建材质时,可选择两个着色器:StandardStandard (Specular setup)
    • Standard: 着色器显示Metallic值,表示材质是否为金属性
      • 使用金属性材质的情况下,反照率颜色 (Albedo) 控制镜面反射的颜色,且大多数光线以镜面反射形式反射
      • 非金属性材质具有与入射光颜色相同的镜面反射,并且在正面观察表面时几乎不会反射
    • Standard (Specular setup) 使用镜面反射颜色来控制材质中镜面反射的颜色强度
      • 可使镜面反射具有与漫射不同的颜色。
  • 在基于物理着色的世界中,可以使用来自已知真实材质的参考。如需了解这些参考的一些示例,请查看材质图表 https://docs.unity.cn/Manual/StandardShaderMaterialCharts.html
材质参数
           
已到首页—已到末页