「MonoGameでハードウェアインスタンシングしてみる」の版間の差分

編集の要約なし
 
(同じ利用者による、間の2版が非表示)
11行目: 11行目:


== HLSL側を書く ==
== HLSL側を書く ==
ワールド座標(ワールド空間内での位置や傾きなど)は、
[[ワールド座標]](ワールド空間内での位置や傾きなど)は、


一般的なシェーダーではユニフィード変数で受け取る。
一般的な[[シェーダー]]では[[ユニフォーム変数]]で受け取る。
<source lang="hlsl">
float4x4 World; //これがワールド座標
float4x4 World; //これがワールド座標
float4x4 View;
float4x4 View;
float4x4 Projection;
float4x4 Projection;
</source>


一方、ハードウェアインスタンシングを使う場合はダイナミック頂点バッファとして複数の値を受け取る。
一方、[[ハードウェアインスタンシング]]を使う場合はダイナミック頂点バッファとして複数の値を受け取る。
<source lang="hlsl">
<source lang="hlsl">
float4x4 View;
float4x4 View;
42行目: 44行目:


== C#側を書く ==
== C#側を書く ==
まずインスタンスを格納するクラスを作る。
まず3Dモデルのインスタンス([[ワールド座標]])を格納する[[クラス]]を作る。
<source lang="csharp">
<source lang="csharp">
public struct VertexDynamicInstance : IVertexType
public struct VertexDynamicInstance : IVertexType
74行目: 76行目:
</source>
</source>


ダイナミック頂点バッファを生成する。
インスタンス群を格納したダイナミック頂点バッファを生成する。
<source lang="csharp">
<source lang="csharp">
// ダイナミック頂点バッファを作って
var instanceVertexBuffer = new DynamicVertexBuffer(graphicsDevice,
var instanceVertexBuffer = new DynamicVertexBuffer(graphicsDevice,
     VertexDynamicInstance.VertexDeclaration,
     VertexDynamicInstance.VertexDeclaration,
81行目: 84行目:
     BufferUsage.WriteOnly);
     BufferUsage.WriteOnly);


// インスタンス群を入れ込む
instanceVertexBuffer.SetData(instances);
instanceVertexBuffer.SetData(instances);
</source>
</source>