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);
            }

関連項目