US3S10L1——网格、网格渲染器、材质、着色器等之间的关系

网格(Mesh)

网格是一个 3D 对象的几何数据。它由顶点、边和面组成。网格描述了对象的形状和结构,定义了3D模型的轮廓。
网格中包含了模型的关键数据,比如:顶点、法线、切线、纹理坐标、顶点颜色、骨骼权重、骨骼索引、网格边界等等信息

例如,这个枪械模型下的 GunTwo,就是一个网格:

image

我们在 Shader 中使用的模型的数据就来自于 Mesh,其中:

  • Unity 中不带骨骼动画的模型网格数据一般在 Mesh Filter(网格过滤器)组件中进行关联
  • 带骨骼动画的模型网格数据一般在 Skinned Mesh Renderer(蒙皮网格渲染器)中进行关联

网格渲染器(Mesh Renderer)

网格渲染器是 Unity 中的一个组件,用于将网格绘制到屏幕上,它主要用来:

  1. 引用一个网格对象来获取几何数据

    MeshRenderer​ 组件会自动寻找同一 GameObject​ 上 MeshFilter​ 组件中的网格(Mesh​)并将其渲染出来

    image

  2. 引用一个或多个材质,用于定义对象的外观

    一般不带骨骼动画的模型都使用网格渲染器来进行渲染

比如:游戏中的建筑物,箱子,地面等等不需要骨骼动画的模型

关于 Mesh Renderer 的具体参数,详见:Mesh Renderer 组件 - Unity 手册

image

  • Materials 材质

    该属性允许你指定一个或多个材质(Material),它们定义了网格在场景中的外观。

  • Lighting 光照相关

    • Cast Shadows 投射阴影,控制网格是否能够投射阴影

      image

      • On:总是投射阴影。
      • Off:从不投射阴影。
      • Two Sided:双面投射阴影,适用于非封闭物体。
      • Shadow Only:仅当计算阴影时才考虑网格。
    • Receive Shadows 接收阴影,决定是否接收其他对象投射的阴影

    • Global Illumination 全局光照(GI)相关

      Global Illumination(简称GI)是全局光照,是一种渲染技术,旨在模拟光线在场景中反弹的物理行为,包括直接光和间接光的效果。

      仅在为该场景启用了烘焙全局光照(Baked Global Illumination)或 Enlighten 实时全局光照(Enlighten Realtime Global Illumination)时,以下属性才有作用。

      • Contribute Global Illumination 添加到全局光照内

        将此渲染器包含在全局光照计算中,这些计算是在烘焙时进行的

        启用此属性会在 GameObject​ 的静态编辑器标志(Static Editor Flags)中启用“添加GI”(Contribute GI)标志。它对应于 StaticEditorFlags.ContributeGI​ API。

      • Receive Global Illumination 接收全局光照

        让 Unity 从 烘焙的光照贴图 或者从 运行时光照探针 向此渲染器提供全局光照数据。此属性仅在启用了 Contribute Global Illumination 的情况下,此属性才可编辑。

        image

        • Lightmaps 从烘焙的光照贴图接收全局光照
        • Light Probes 从运行时光照探针接收全局光照
  • Lightmapping 光照贴图相关(使用光照贴图接收全局光照才显示)

    仅当上文中的 Receive Global Illumination(接收全局照明)设置为 Lightmaps(光照贴图)时,此部分才可见。

    • Scale in Lightmap 在光照贴图中缩放

      指定此渲染器的 UV 在光照贴图中的相对大小

      值为 0 意味着该渲染器不会被光照贴图处理,但它仍然会对场景中的其他渲染器的光照做出贡献。大于1.0的值会增加为此渲染器使用的像素数量(即光照贴图分辨率),而小于1.0的值则会减少它。

      可以使用这个属性来优化光照贴图,使得重要的和细节丰富的区域能够更准确地被照亮。例如,一个孤立的建筑如果有平坦且暗色的墙面,可以使用较低的光照贴图缩放比例(小于1.0),而一组紧密排列、色彩鲜艳的摩托车则需要较高的缩放比例值。

    • Stitch Seams 是否启用光照贴图接缝缝合

      为此渲染器启用 Lightmap seam stitching(光照贴图接缝缝合)

    • Lightmap Parameters 为此渲染器选择或创建光照贴图参数资源

  • Probes 探针相关

    • Light Probes 光照探针

      设置网格如何与光照探针(Light Probes)交互以获得间接光照

      image

      • Off:不使用任何插值光照探针
      • Blend Probes:使用一个插值光照探针(默认)
      • Use Proxy Volume:使用代理体积
      • Custom Provided:自定义条件
    • Reflection Probes 反射探针

      确定网格是否以及如何使用反射探针(Reflection Probes)

      image

      • Off:不使用反射探针
      • Blend Probes:混合周围反射探针
      • Blend Probes and Skybox:混合反射探针和天空盒
      • Simple:使用反射探针,但不混合
    • Anchor Override 锚点覆盖

      重新设置 Unity 在使用光照探针(Light Probes)或反射探针(Reflection Probes)系统时用来确定插值位置的 Transform​。
      默认情况下,这是渲染器几何体的边界框中心。

  • Additional Settings 其他设置

    • Motion Vectors 运动矢量

      控制是否使用运动矢量来跟踪此渲染器的每像素屏幕空间运动,这对于后期处理效果,例如运动模糊很重要。

      image

      并非所有平台都支持运动矢量。有关更多信息,请参阅 SystemInfo.supportsMotionVectors

      • Camera Motion Only:仅使用摄像机运动来跟踪
      • Per Object Motion:使用特定过程跟踪此渲染器的运动
      • Force No Motion:不跟踪运动
    • Dynamic Occlusion 动态遮挡剔除

      启用或禁用动态遮挡剔除,动态遮挡剔除可以帮助优化性能。
      但如果需要在墙后绘制角色轮廓等效果,则此项需要禁用

蒙皮网格渲染器(Skinned Mesh Renderer)

蒙皮网格渲染器是一种特殊的网格渲染器,用于处理带有骨骼动画的网格。
它不仅处理网格的几何数据,还处理骨骼和权重,允许网格根据骨骼动画进行变形。
使用蒙皮网格渲染器的对象不需要再使用 MeshFilter​ 组件,它可以直接关联对应的网格信息

一般带有动画的模型都使用蒙皮网格渲染器来进行渲染,比如:游戏中的角色、怪物、机关等等

关于 Skinned Mesh Renderer 的具体参数,详见:Skinned Mesh Renderer component - Unity 手册

image

  • Bounds 边界

    设置 Unity 用于确定网格何时离开屏幕的包围盒边界。在 Model 文件中导入网格和动画时,Unity 会预先计算这个边界,并在 Scene 视图中将边界显示为 Model 周围的线框。

    如果将 Update When Offscreen 设置为 True,则 Unity 会在每帧中重新计算这些边界,并使用这些计算值覆盖此属性。

  • Quality 质量

    设置运行时每个顶点使用的骨骼数的上限

    image

    • Auto 自动
    • 1 Bone 每个顶点仅使用一个骨骼
    • 2 Bones 每个顶点最多使用两个骨骼
    • 4 Bones 每个顶点最多使用四个骨骼
  • Update When Offscreen 在屏幕外时更新

    启用此选项可计算每帧的 Bound,即使网格在任何一个 Camera 都不可见也是如此。禁用此选项可在游戏对象离开屏幕时停止蒙皮,并在游戏对象再次可见时恢复蒙皮。

  • Mesh 网格,设置此渲染器使用的网格

    此网格应包含有效的绑定姿势和蒙皮权重、使用混合变形或运行布料模拟。如果网格不使用这些技术中的任何一种,请考虑使用 Mesh Renderer 和 Mesh Filter。

  • Root Bone 根骨骼

    设置作为根骨骼的 Transform​。Bounds 将随此 Transform​ 移动

  • Materials 材质

    该属性允许你指定一个或多个材质(Material),它们定义了网格在场景中的外观。

  • Lighting 光照相关

    • Cast Shadows 投射阴影,控制网格是否能够投射阴影

      image

      • On:总是投射阴影。
      • Off:从不投射阴影。
      • Two Sided:双面投射阴影,适用于非封闭物体。
      • Shadow Only:仅当计算阴影时才考虑网格。
    • Receive Shadows 接收阴影,决定是否接收其他对象投射的阴影

  • Probes 探针相关

    • Light Probes 光照探针

      设置网格如何与光照探针(Light Probes)交互以获得间接光照

      image

      • Blend Probes:混合附近光照探针的颜色。
      • Use Proxy Volume:使用代理体积来获取光照信息。
      • Override Bounds:覆盖默认边界并使用自定义边界。
      • Sample Position:使用变换位置采样光照探针。
    • Reflection Probes 反射探针

      确定网格是否以及如何使用反射探针(Reflection Probes)

      image

      • Off:不使用反射探针。
      • Blend Probes:混合周围反射探针。
      • Blend Probes and Skybox:混合反射探针和天空盒。
      • Simple:仅使用最近的反射探针。
    • Anchor Override 锚点覆盖

      重新设置 Unity 在使用光照探针(Light Probes)或反射探针(Reflection Probes)系统时用来确定插值位置的 Transform​。
      默认情况下,这是渲染器几何体的边界框中心。

  • Additional Settings 其他设置

    • Skinned Motion Vectors 蒙皮运动矢量

      启用此选项会对网格蒙皮数据进行双重缓冲,以便 Unity 可以插入蒙皮运动并将其放入运动矢量贴图中。这会使用更多的 GPU 内存,但会产生更正确的运动矢量。

    • Dynamic Occlusion 动态遮挡剔除

      启用或禁用动态遮挡剔除,动态遮挡剔除可以帮助优化性能。
      但如果需要在墙后绘制角色轮廓等效果,则此项需要禁用

材质(Material)

材质我们也可以称为材质球,它定义了模型网格的外观
材质包含对一个着色器的引用,并通过一组属性(例如颜色、纹理等等信息)来配置着色器
一个模型可以有多个材质,每个材质应用于模型的不同部分

详细内容可见:US2S2L1——材质与Shader

着色器(Shader)

Shader 是一种用于描述如何渲染图形和计算图形外观的程序,主要用于控制图形的颜色、光照、纹理和其他视觉效果
它是运行在 GPU 上的程序,用于计算每个像素的颜色,这套课中学习的知识都是和着色器有关的

详细内容可见:US2S2L1——材质与Shader

网格、(蒙皮)网格渲染器、材质、着色器之间的关系

  • Mesh Renderer(网格渲染器)

    • Mesh(网格) —— MeshFilter(网格过滤器组件进行关联)

      • Geometry Data(几何数据)
    • Material(材质)

      • Shader(着色器)

      • Properties(属性)

        颜色、纹理等属性,由 Shader 决定哪些属性暴露在材质上

    image

  • Skinned Mesh Renderer(蒙皮网格渲染器)

    • Mesh(网格)

      • Geometry Data(几何数据)
    • Bones & Weights(骨骼与权重)

    • Material(材质)

      • Shader(着色器)

      • Properties(属性)

        颜色、纹理等属性,由 Shader 决定哪些属性暴露在材质上

    image

从关系中我们可以得出,由于 MeshRenderer​ 和 SkinnedMeshRenderer​ 都是 Unity 中的组件
如果想要获取、修改一个对象 Mesh(网格)、Material(材质)、材质上属性、材质关联的Shader(着色器)等等信息,都可以利用这两个组件去获取