📗
【Unity Summary】 Mesh
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)
- Skined Mesh
- Mesh with Blend Shape
- 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 には、以下が含まれる
- Skined Mesh(Bone と Bind pose を持つ Mesh)
- Mesh with Blend Shape
- Mesh with Cloth component
- 可変 Mesh には、以下が含まれる
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つ
- Vertex
- Mesh
Vertex Compression
- Project 内の全ての Mesh に影響する設定
- Mesh に低精度のデータ形式を使用可能
- memory 内の Mesh データの size が小さくなり、ファイルサイズがわずかに減少し、GPU パフォーマンスが向上する可能性がある
- 精度が落ちるというデメリットもある
- Mesh に低精度のデータ形式を使用可能
Mesh Compression
- 個々の Mesh に影響する設定
- disk 上の Mesh データを圧縮し、ファイル size を小さくする
- load 時間の増加、load 時の一時的な memory 使用量の増加、圧縮による Artifact の可能性あり
- disk 上の Mesh データを圧縮し、ファイル size を小さくする
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
ファイルに書き込む
- Mesh や Texture の Header と Binary data の両方を "1つ" の
- Runtime
- Texture や Mesh の Header data と Binary data の両方を
.res
ファイルから memory に load - すべてのデータが memoery に入ると、Binary data を memory から GPU に upload
- load と upload の作業は、主に main thread で 1 frame 内で実行
- Texture や Mesh の Header data と Binary data の両方を
非同期 upload Pipeline
- 1 frame
- "Header data のみ" を load する必要がある
- 次 frame で Binary data を GPU に Streaming することが可能
- Build
- Header データを
.res
ファイル、Binary data を"別の".res
ファイルに書き込む
- Header データを
- 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
- Texture の Header と Binary data の両方を 1 つの
API Updater
- API version up 変更に自動で対応する
- script や assembly 内の古い code を特定・更新する
- 以下2種類の Updater が存在する
- ScriptUpdater:script
- AssemblyUpdater:Asembly(
.dll
)
Discussion