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

提供: MonoBook
移動先: 案内検索

VertexBufferクラスは、ポリゴンを表示するのに使う頂点のリストである。

MonoGameでは頂点構造体を単純な配列で保持しておいてもDrawUserPrimitevesメソッドで描画できるが、VertexBufferクラスを使っておくと頂点バッファメインメモリからVRAMへ事前に転送しておけるので高速化が見込める。

C#でゴリゴリと頂点データを加工したい場合はメインメモリVRAMを行ったり来たりが相当な無駄になるのであまり向いていない。 逆にほとんどのケースが該当する「頂点データを決めたら破棄するまで変形させないもの」には使ったほうがよいとされている。 また、C#ではなくHLSL頂点シェーダー頂点バッファの加工を行う場合は必須となる。

ちなみに一部のOpenGL系プラットフォームでは一度格納すると二度と取り出せない(GetDataできない)ものも存在している。 3Dモデルの頂点データを入れて頂点シェーダーで当たり判定の範囲を動的に生成しGetDataで取得していたものが動かなくて悲しくなった。

継承[編集 | ソースを編集]

  • System.Object
    • Microsoft.Xna.Framework.Graphics.GraphicsResource
      • Microsoft.Xna.Framework.Graphics.VertexBuffer
        • Microsoft.Xna.Framework.Graphics.DynamicVertexBuffer

名前空間[編集 | ソースを編集]

構文[編集 | ソースを編集]

public class VertexBuffer : GraphicsResource

コンストラクタ[編集 | ソースを編集]

名称 概要
protected VertexBuffer(GraphicsDevice, VertexDeclaration, int, BufferUsage, bool)
public VertexBuffer(GraphicsDevice, VertexDeclaration, int, BufferUsage)
public VertexBuffer(GraphicsDevice, Type, int, BufferUsage)

プロパティ[編集 | ソースを編集]

名称 概要
public BufferUsage
public GraphicsDevice (GameResourceクラスから継承)
public IsDisposed (GameResourceクラスから継承)
public Name (GameResourceクラスから継承)
public Tag (GameResourceクラスから継承)
public VertexCount
public VertexDeclaration

メソッド[編集 | ソースを編集]

名称 概要
public Dispose(bool) 派生クラスを作る場合は自前管理のリソースの破棄を実装する必要がある。
protected Dispose() (GameResourceクラスから継承)
protected Finalize (GameResourceクラスから継承)
public GetData<T>(int, T[], int, int, int) この頂点バッファから頂点データを取得する。
public GetData<T>(T[], int, int)
public GetData<T>(T[])
protected internal GraphicsDeviceResetting GraphicsDeviceがリセットされGPU上のリソースを再作成する必要があるときに呼ばれる。
public SetData<T>(int, T[], int, int, int) この頂点バッファに頂点データを設定する。大雑把に言えば頂点データの配列をメインメモリからVRAMにコピーする。
public SetData<T>(T[])
public SetData<T>(T[], int, int)
protected SetDataInternal<T>
public ToString (GameResourceクラスから継承)

イベント[編集 | ソースを編集]

名称 概要
public Disposing (GameResourceクラスから継承)

実装例[編集 | ソースを編集]

まずVertexBufferを作ってSetDataする。

            // 頂点データを作成する
            var vertices = new VertexPositionColor[6];
            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.Blue);
            vertices[3] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Green);
            vertices[4] = new VertexPositionColor(new Vector3(+10, +10, 0), Color.White);
            vertices[5] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Blue);

            // 頂点データをGPUに送り込む
            _vertexBuffer = new VertexBuffer(_graphics.GraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.None);
            _vertexBuffer.SetData(vertices);

描画するときは、GraphicsDeviceクラスのSetVertexBufferメソッドで読み出して、DrawPrimitivesメソッドで描画する。 別途インデックスバッファを使用しているときはDrawPrimitivesメソッドではなくDrawIndexedPrimitivesメソッドを使うこと。

            _graphics.GraphicsDevice.SetVertexBuffer(_vertexBuffer);

            foreach (var pass in _effect.CurrentTechnique.Passes)
            {
                pass.Apply();
                _graphics.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, _vertexBuffer.VertexCount / 3);
            }

関連項目[編集 | ソースを編集]