MonoGame/クラスライブラリ/IndexBufferクラス

提供: MonoBook
< MonoGame‎ | クラスライブラリ
2017年11月7日 (火) 04:00時点におけるimported>Administratorによる版 (→‎使用例)
ナビゲーションに移動 検索に移動

IndexBufferクラスは、ポリゴンを表示するのに使う頂点バッファの無駄を省くインデックスバッファを効率的に管理するクラスである。 VertexBufferクラスと同様にグラフィックボード上のVRAMに事前に展開しておくなどの機能を持つ。

継承

名前空間

構文

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で割る
                );
            }

関連項目