Unity物体渲染

1. 导入与资源处理

  • 文件检测:Unity监控项目文件夹(Assets),当检测到新文件(如.fbx、.obj、.png、.jpg等)时,会触发导入流程。

  • 资源转换:根据文件类型,Unity的导入器(Importers)会进行相应处理:

    • 3D模型:FBX/OBJ等文件被解析为网格(Mesh)、材质(Material)、动画(Animation)等子资源。

    • 纹理:图片被转换为Unity内部格式(如DXT压缩),生成纹理资源。

    • 其他:音频、视频等也会被相应处理。

  • 生成元数据:为每个资源创建.meta文件,存储导入设置(如缩放、法线计算、压缩格式等)。


2. 场景实例化

当你从Project窗口拖入Scene视图Hierarchy窗口时:

  • 实例化GameObject:Unity根据资源创建对应的GameObject:
    • 3D模型 → 包含MeshFilter(持有Mesh)和MeshRenderer(持有材质/着色器)。
    • 2D精灵 → 包含SpriteRenderer
  • 组件与默认设置:自动添加必要的组件(如Collider,如果模型包含碰撞体数据),并根据导入设置调整位置、比例。

3. 渲染流程(简化版)

实例化后的物体进入Unity的渲染管线,具体取决于项目使用的渲染管线(Built-in RP、URP或HDRP)。以通用流程为例:

A. 准备阶段

  • 材质与着色器
    • 如果模型自带材质,Unity会使用它;否则生成默认材质(Standard Shader等)。
    • 着色器(Shader)定义物体的表面属性(颜色、光滑度、法线等)和光照计算方式。
  • 渲染器组件MeshRendererSpriteRenderer负责将物体的几何数据提交给渲染管线。

B. 剔除(Culling)

  • 视锥体剔除:Unity摄像机每帧计算视锥体,剔除视野外的物体。
  • 遮挡剔除(如果启用):进一步剔除被其他物体完全遮挡的物体。

C. 渲染循环

Unity每帧执行以下关键步骤(以Built-in RP为例):

  1. 几何阶段
    • 物体网格数据(顶点、UV、法线)经变换(Model→World→View空间)后,传递给GPU。
    • 如果使用动态批处理或GPU Instancing,Unity会合并相同材质的物体以减少Draw Call。
  2. 光照与阴影
    • 根据场景光源(方向光、点光源等)计算光照:
      • 前向渲染(Forward Rendering):为每个物体计算一个主光和多个逐像素光。
      • 延迟渲染(Deferred Rendering):先将几何信息写入G-Buffer,再计算光照。
    • 阴影渲染:如果有光源投射阴影,Unity会从光源视角渲染深度图,用于后续阴影计算。
  3. 像素处理
    • 着色器对每个像素计算颜色,结合纹理采样、光照、阴影等。
    • 透明物体通常会在不透明物体之后渲染,并启用Alpha混合。
  4. 后期处理
    • 可选的屏幕效果(如Bloom、色调调整)应用于最终图像。
  5. 输出到屏幕:渲染结果输出到摄像机目标(通常是屏幕或渲染纹理)。

4. 优化相关

  • 批处理:拖入的物体如果材质相同,可能被静态/动态批处理合并。
  • LOD Group:如果模型包含多级细节,Unity会根据距离自动切换不同精度的网格。
  • 光照贴图:如果物体标记为Static,其光照信息可烘焙到光照贴图中,提升运行时性能。

5. 注意事项

  • 性能影响:复杂模型(高多边形、多材质)会增加Draw Call,需通过优化减少负担。
  • 渲染管线差异:URP/HDRP的渲染流程更模块化,但核心逻辑(剔除→几何处理→光照→输出)类似。
  • 自定义着色器:如果使用自定义Shader,需确保其与当前渲染管线兼容。

总结

拖入物体时,Unity完成了资源处理→实例化→纳入渲染管线的完整流程。渲染过程则是每帧按剔除、几何处理、光照计算、像素着色、后期处理的顺序执行,最终将物体视觉化。理解这一流程有助于优化美术资源和渲染性能。