「MonoGame/クラスライブラリ/IndexBufferクラス」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (ページの作成:「IndexBufferクラスは、ポリゴンを表示するのに使う頂点バッファの無駄を省くインデックスバッファを効率的に管理する...」) |
imported>Administrator (→関連項目) |
||
(同じ利用者による、間の1版が非表示) | |||
178行目: | 178行目: | ||
{ | { | ||
pass.Apply(); | pass.Apply(); | ||
− | _graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _indexBuffer.IndexCount / 3); | + | _graphics.GraphicsDevice.DrawIndexedPrimitives( |
+ | PrimitiveType.TriangleList, // 三角形の秘密はね… | ||
+ | baseVertex: 0, // vertex側のはじまり | ||
+ | startIndex: 0, // index側のはじまり | ||
+ | primitiveCount: _indexBuffer.IndexCount / 3 // 全部三角形なので単純に3で割る | ||
+ | ); | ||
} | } | ||
</source> | </source> | ||
192行目: | 197行目: | ||
** [[MonoGame/クラスライブラリ/VertexPositionColorTexture構造体]] | ** [[MonoGame/クラスライブラリ/VertexPositionColorTexture構造体]] | ||
** [[MonoGame/クラスライブラリ/VertexPositionNormalTexture構造体]] | ** [[MonoGame/クラスライブラリ/VertexPositionNormalTexture構造体]] | ||
+ | * [[三角形の秘密についてリークする]] | ||
[[category: MonoGame]] | [[category: MonoGame]] |
2017年11月7日 (火) 04:00時点における最新版
IndexBufferクラスは、ポリゴンを表示するのに使う頂点バッファの無駄を省くインデックスバッファを効率的に管理するクラスである。 VertexBufferクラスと同様にグラフィックボード上のVRAMに事前に展開しておくなどの機能を持つ。
継承[編集 | ソースを編集]
- System.Object
名前空間[編集 | ソースを編集]
構文[編集 | ソースを編集]
public class IndexBuffer : GraphicsResource
コンストラクタ[編集 | ソースを編集]
名称 | 概要 | |
---|---|---|
protected | IndexBuffer(GraphicsDevice, Type, int, BufferUsage, bool) | |
protected | IndexBuffer(GraphicsDevice, IndexElementSize, int, BufferUsage, bool) | |
public | IndexBuffer(GraphicsDevice, IndexElementSize, int, BufferUsage) | |
public | IndexBuffer(GraphicsDevice, Type, int, BufferUsage) |
プロパティ[編集 | ソースを編集]
名称 | 概要 | |
---|---|---|
public | BufferUsage | |
public | GraphicsDevice | (GameResourceクラスから継承) |
public | IndexCount | |
public | IndexElementSize | |
public | IsDisposed | (GameResourceクラスから継承) |
public | Name | (GameResourceクラスから継承) |
public | Tag | (GameResourceクラスから継承) |
メソッド[編集 | ソースを編集]
名称 | 概要 | |
---|---|---|
public | Dispose() | (GameResourceクラスから継承) |
protected | Dispose(bool) | 派生クラスを作る場合は自前管理のリソースの破棄を実装する必要がある。 |
protected | Finalize | (GameResourceクラスから継承) |
public | GetData<T>(int, T[], int, int) | このインデックスバッファからインデックスを取得する。 |
public | GetData<T>(T[], int, int) | |
public | GetData<T>(T[]) | |
protected internal | GraphicsDeviceResetting | GraphicsDeviceがリセットされGPU上のリソースを再作成する必要があるときに呼ばれる。 |
public | SetData<T>(T[], int, int) | この頂点バッファに頂点データを設定する。大雑把に言えば頂点データの配列をメインメモリからVRAMにコピーする。 |
public | SetData<T>(T[]) | |
public | SetData<T>(int, T[], int, int) | |
protected | SetDataInternal<T> | |
public | ToString | (GameResourceクラスから継承) |
イベント[編集 | ソースを編集]
名称 | 概要 | |
---|---|---|
public | Disposing | (GameResourceクラスから継承) |
使用例[編集 | ソースを編集]
まずVertexBufferを作ってSetDataする。 次にIndexBufferを作ってSetDataする。 IndexBufferは配列型とIndexElementSize列挙体が食い違わないように注意すること。また配列のオーバーフローにも注意。
// 頂点データを作成する
var vertices = new VertexPositionColor[4];
vertices[0] = new VertexPositionColor(new Vector3(-10, -10, 0), Color.Red);
vertices[1] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Green);
vertices[2] = new VertexPositionColor(new Vector3(+10, +10, 0), Color.White);
vertices[3] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Blue);
// 頂点データをGPUに送り込む
_vertexBuffer = new VertexBuffer(_graphics.GraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.None);
_vertexBuffer.SetData(vertices);
// 16ビット配列のインデックスバッファを作成する
var indeces = new short[6];
indeces[0] = 0; indeces[1] = 1; indeces[2] = 2;
indeces[3] = 0; indeces[4] = 2; indeces[5] = 3;
// インデックスデータをGPUに送り込む
_indexBuffer = new IndexBuffer(_graphics.GraphicsDevice, IndexElementSize.SixteenBits, indeces.Length, BufferUsage.None);
_indexBuffer.SetData(indeces);
描画するときは、GraphicsDeviceクラスのSetVertexBufferメソッドでVertexBufferを読み出し、続いてGraphicsDevice.Indicesプロパティにインデックスバッファを設定し、DrawIndexedPrimitivesメソッドで描画する。
// 描画
_graphics.GraphicsDevice.SetVertexBuffer(_vertexBuffer);
_graphics.GraphicsDevice.Indices = _indexBuffer;
foreach (var pass in _effect.CurrentTechnique.Passes)
{
pass.Apply();
_graphics.GraphicsDevice.DrawIndexedPrimitives(
PrimitiveType.TriangleList, // 三角形の秘密はね…
baseVertex: 0, // vertex側のはじまり
startIndex: 0, // index側のはじまり
primitiveCount: _indexBuffer.IndexCount / 3 // 全部三角形なので単純に3で割る
);
}