Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mesh クラスの頂点フォーマットを汎用的にする #113

Open
lriki opened this issue Dec 24, 2019 · 0 comments
Open

Mesh クラスの頂点フォーマットを汎用的にする #113

lriki opened this issue Dec 24, 2019 · 0 comments
Labels
proposal 実装済みの機能を変更する場合に使用する。

Comments

@lriki
Copy link
Collaborator

lriki commented Dec 24, 2019

Proposal

MeshResource は内部に合計 5 つの VertexBuffer を持っているが、フォーマットが MMD モデルに寄っているため、汎用的にしたい。

enum VertexBufferGroup
{
	VBG_Basic = 0,
	VBG_BlendWeights = 1,
	VBG_AdditionalUVs = 2,
	VBG_SdefInfo = 3,
	VBG_MmdExtra = 4,
};

また、VBG_Basic の頂点フォーマットは次のようになっている。

struct Vertex
{
	Vector3 position;
	Vector3 normal;
	Vector2 uv;
	Color color;
};

汎用化を目指すなら Unity や Three.js のように、各要素で別々の配列 (頂点バッファ) を指定できるようにした方が良いのでは?

var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );

Motivation

  • フォーマットが MMD モデルに寄っているため、汎用的にしたい。
  • 自由に頂点データを追加したい。
  • glTF のように非常に柔軟な頂点フォーマットを持つモデルの読み込みに対応したい。

Implementation

VertexLayout 付きの頂点データを外部から指定できるようにする、という方針となる。

内部データは VertexBuffer が分かれても、ひとつにまとめても構わない。ただ、内部フォーマットへの変換処理を実装することになる。

要素ごとに VertexBuffer を分けるべきか?

編集が簡単になるが、描画時のキャッシュ効率が落ちる。

編集と言っても、そもそも一般的に描画用メッシュクラスは編集用に作られてはおらず、編集したければ Half-Edge Mesh などを使うべき。
頂点位置の微調整や法線計算、箱や球といった他のメッシュを(描画効率向上のため)マージするのはサポートしてもいいともうけど…。

各言語バインダ用の API

例えば、Ruby は構造体という仕組みが無いので、VertexBuffer にバイナリデータを直書きするのか、アクセサを提供するのか。

バイナリデータを直接扱うのは言語によってかなり得手不得手あるので、基本はアクセサの提供にしたい。

ちなみに UE4 は、各要素の配列を受け取って Mesh を作るユーティリティがある。
https://docs.unrealengine.com/en-US/API/Plugins/ProceduralMeshComponent/UProceduralMeshComponent/CreateMeshSectio-/index.html

Research

UE4

StaticMesh の頂点バッファは次のようになっている。

struct FStaticMeshVertexBuffers
{
	FStaticMeshVertexBuffer StaticMeshVertexBuffer;	// Normal, Tangent, Binormal, UV
	FPositionVertexBuffer PositionVertexBuffer;		// Pos のみ
	FColorVertexBuffer ColorVertexBuffer;			// Color のみ
}

やはりある程度の要素はひとつの VertexBuffer にまとめることで、キャッシュの効率化を狙っている?

@lriki lriki added the proposal 実装済みの機能を変更する場合に使用する。 label Dec 24, 2019
lriki added a commit that referenced this issue Dec 24, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
proposal 実装済みの機能を変更する場合に使用する。
Projects
None yet
Development

No branches or pull requests

1 participant