📗

【Unity Summary】 Mesh

2025/02/15に公開

Mesh

  • ある形状を表すデータの集まりのこと
  • Material と共に使用
    • Mesh:(GPU が描画する Object の)形状を表す
    • Material:表面の状態を表す
  • 物理演算では、Mesh を使って Collider の形状を決定
  • 以下の property によって定義される
properties description
頂点 - 3D 空間における位置の collection
- 任意で属性を追加可能
Topology Mesh を構成している最小単位の面形状
Index Topology に基づいて、頂点をどのように組み立てて surface が作るかを表す
Blend Shape - Mesh の様々な変形 version を表すデータ
- Animation に使用
Bind Pose skin された Mesh の skelton の “基本” ポーズを表すデータ

Variable Mesh(Deform)

  1. Skined Mesh
  2. Mesh with Blend Shape
  3. Mesh with Cloth component

Skined Mesh

  • Bone という追加データで動作する Mesh
    • Bone は skelton(Rig、joint 階層とも呼ばれる)と呼ばれる構造を形成
    • skelton が動くときにリアルに変形するためのデータを含む
  • Animation 機能とともに Skeltan Animation に使用する
    • Rigidbody component と一緒に使用し、“Ragdoll” 効果を作成することも可能

Mesh with Blend Shape

  • Mesh が様々な形状に変形された version を表す
  • Morph target Animation に使用される
    • 顔の表情の Animation の一般的な technique

Mesh with Cloth component

  • リアルな cloth(布)の similation のために利用

頂点データ

  • 頂点データの要素は、「頂点属性」と呼ばれる
  • 各頂点は以下の属性を持つことが可能
attributes component methods deprecated
Position - Object 空間における頂点の位置
- Mesh の表面を決定
Mesh.GetVertices
Mesh.SetVertices
Mesh.vertices
Normal(法線) - 頂点位置で surface から直接 “外” を指す方向を表す
- Mesh surface の light の反射を計算
Mesh.GetNormals
Mesh.SetNormals
Mesh.normals
Tangent(接線) 頂点位置で surface の “u”(水平 Texture)軸に沿った方向を表す Mesh.GetTangents
Mesh.SetTangents
Mesh.tangents
Color 頂点の通常色を表す Mesh.GetColors
Mesh.SetColors
Mesh.colors
最大 8 つの Texture 座標(UV) Texture 座標は一般に UV と呼ばれ、ひとまとまりになったものは Channel と呼ぶ
Bone weight Bone が頂点に与える影響の強さを示す(Skined Mesh only)
Blend index どの Bone が頂点に影響を与えるかを示す(Skined Mesh only)

UV / Channel

UV

  • Texture 座標のこと
    • 3Dモデルにどんな感じで画像を展開・張り付けるかを指定する座標
  • poligon 単位での texture 画像の任意の位置を貼り付けるもの

Channel

  • UV(Texture 座標)の集合体のこと

topology(幾何学)

  • Mesh が「持つ面の種類」を示す
    • Triangle
    • Quad(4つ角の何か)
    • Lines
    • LineStrip
    • Points

index data

  • index 配列には「頂点位置配列の要素を参照するための整数」が含まれる
  • index を使用して、頂点の位置を面に接続する

winding order(巻き順)

  • index 配列における各 Group の頂点の順序
  • 巻き順を使用して、「面が表向きか裏向きか」を判断する
    • その結果、面を Rendering すべきか Culling(Rendering から除外)すべきかを判断

Mesh Asset

  • Unity project の Mesh を表す

Vertices

  • Mesh に含まれる頂点の総数、および Mesh の頂点データを保存するために使用する disk 容量と Runtime memory の量

Indices

  • Mesh に含まれる index の総数、このデータを保存するために使用する disk 容量と Runtime memory の量、および各 sub Mesh の index に関する情報

Skin

BlendWeight
  • 1 つの頂点に影響を与えられる Bone の数
BlendIndices
  • Skin された頂点に影響を与える Bone の index
Blend Shapes
  • Mesh に含まれる Blend Shape の総数と名前のリスト
  • 各 Blend Shape の横にある frame 数は、それぞれの Blend Shape が持つ key frame 数を表す

Other

Bounds Center

  • Mesh の最も外側にある edge がどこにあるかを表す
  • Bounds Center は、 Mesh の Bounding Box の中心位置を保存

Bounds Size

  • Bounding Box の edge の X、Y、Z 方向の長さを表す

Read/Write Enabled

  • Mesh.isReadable property の値
  • Runtime に特定の Mesh データにアクセスし、変更できるかどうかを決定

Mesh Preview

value description
Shaded 基本的な light で Mesh の視覚化
UV Checker Mesh の UV Map がどのように Texture を適用するかを視覚化
UV Layout Unwrap した UV Map の中で、 Mesh の頂点がどのように構成されているかを視覚化
Vertex Color Mesh の頂点が持つあらゆる頂点色を視覚化
Normals Mesh の法線の相対的な方向を色で視覚化
Tangents Mesh の接線データを色で可視化
Blendshapes Mesh への Blend Shape の deformation(変形)を視覚化

Mesh component

Mesh Renderer component

Normal

  • Mesh Filter component と連動し、Mesh Filter が参照する Mesh を描画する
  • MeshRenderer は、その機能の多くを Renderer から継承している
    • 上記より、Renderer を継承する他の component(Line Renderer、Trail Renderer など)と多くの共通点がある
  • 以下を設定可能
    • Materials
    • Lighting
    • Lightmapping
    • Probes
    • Additional Settings

Skinned Mesh Renderer component

  • 可変 (deformable) の Mesh を描画する
    • 可変 Mesh には、以下が含まれる
      1. Skined Mesh(Bone と Bind pose を持つ Mesh)
      2. Mesh with Blend Shape
      3. Mesh with Cloth component

Mesh Filter component

  • Mesh への参照を保存する

Mesh class

  • Object の Mesh Geometry に対する基本的な script interface
  • 配列を使用して、三角形、頂点位置、法線、Texture 座標を表す
  • Mesh data は、Mesh Filter component(Mesh への参照を保存する)を用いて、 Object に attach されている
    • Geometryを作るために Mesh Renderer も必要
  • 当該 component には、GetComponent() でアクセス可能
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
  MeshFilter mf;
  void Start()
  {
    // 対象 Object が MeshFilter を持っている場合は、mf はその component を参照
    mf = GetComponent<MeshFilter>();    
  }
}

Mesh LOD

  • LOD 技術を使用すると、 Camera Object からの距離に基づいて、 Game Object を Rendering する三角形の数を減らすことが可能
  • Game Object の Geometry に Detail level を下げた多くの Mesh を持つ必要がある
    • これらの Mesh は「LOD level」と呼ばれる
  • Game Object が Camera から遠いほど、LOD level の低い LOD level を Rendering する
  • 各 LOD level は、個々の Game Object に存在
    • それぞれがその LOD level を表示する Mesh Renderer component を持つ

How to set

  • LOD を使用するには、LOD Group component を持つ Game Object が必要
    • LOD Group component によって、各 LOD level で表示/非表示にする Game Object を参照する
  • 具体的には以下2つの方法で設定する
type description note
Auto 外部 3D modeling application で LOD level を設定 - Mesh を正しく命名すると、model import 時に LOD Group component を持つ Game Object を自動的に作成して設定
- ExampleMeshName_LOD1 など
Manual LOD Group component で Game Object を作成

How to set(All)

  • Quality Setting Window で、Project 内のすべての Game Object に影響する LOD 設定可能
  • 以下2種類の設定がある
settings note
Maximum LOD Level 指定した LOD level より高い Mesh を build から除外
LOD Bias 閾値の距離で LOD levelを高くするか低くするかを決定

Mesh Compression

  • Mesh データを圧縮して size を小さくし、パフォーマンスを向上
  • 圧縮方法は以下2つ
    1. Vertex
    2. Mesh

Vertex Compression

  • Project 内の全ての Mesh に影響する設定
    • Mesh に低精度のデータ形式を使用可能
      • memory 内の Mesh データの size が小さくなり、ファイルサイズがわずかに減少し、GPU パフォーマンスが向上する可能性がある
    • 精度が落ちるというデメリットもある

Mesh Compression

  • 個々の Mesh に影響する設定
    • disk 上の Mesh データを圧縮し、ファイル size を小さくする
      • load 時間の増加、load 時の一時的な memory 使用量の増加、圧縮による Artifact の可能性あり

Mesh load

  • 以下2種類の方法で、Texture や Mesh のデータを disk から読み込み、GPU に upload する
    • 同期型 upload Pipeline
    • 非同期 upload Pipeline

同期型 upload pipeline

  • 1 frame
    • Texture や Mesh の Meta data(Header data)と、テクセル/頂点データ(Bnary data)の "両方" を読み込む必要がある
  • Build
    • Mesh や Texture の Header と Binary data の両方を "1つ" の .res ファイルに書き込む
  • Runtime
    • Texture や Mesh の Header data と Binary data の両方を .res ファイルから memory に load
    • すべてのデータが memoery に入ると、Binary data を memory から GPU に upload
    • load と upload の作業は、主に main thread で 1 frame 内で実行

非同期 upload Pipeline

  • 1 frame
    • "Header data のみ" を load する必要がある
    • 次 frame で Binary data を GPU に Streaming することが可能
  • Build
    • Header データを .res ファイル、Binary data を"別の" .res ファイルに書き込む
  • Runtime
    • Texture の Header と Binary data の両方を 1 つの .res ファイルに書き込む
    • Application が Texture や Mesh を必要とすると、.res ファイルから Header を memory に load
    • Header が memory に入ったら、size を固定したリング Buffer を使って、.res ファイルから GPU に Binary data を Streaming
    • 複数の Thread を使って数 frame に渡って、Binary data を Streaming
      • なお、既に GPU Hardware を知っている一部の console platform では、リング Buffer を skip して直接 GPU memory に load

API Updater

  • API version up 変更に自動で対応する
    • script や assembly 内の古い code を特定・更新する
  • 以下2種類の Updater が存在する
    • ScriptUpdater:script
    • AssemblyUpdater:Asembly(.dll

Discussion