読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

IndexBuffer

日記 XNA

基本は三角ポリゴン制御なので、普通に正方形を作るには3角形2枚つないで作る。
すると、頂点は3x2で6点。2点重なってるのが無駄ですよねーという話。
なので、共有設定をするのが IndexBuffer だそうで。
論よりRun

VertexPositionColor[] vertices = new[]
{
    new VertexPositionColor(new Vector3(1, 0, 0), Color.White),
    new VertexPositionColor(new Vector3(-1, 0, 0), Color.Red),
    new VertexPositionColor(new Vector3(0, 1, 0), Color.Blue),
    new VertexPositionColor(new Vector3(0, -1, 0), Color.Blue)
};

VertexBuffer vertexBuffer;

// 3点一塊で、3角形を指定する。
short[] indices = new short[]
{ 
    0, 1, 2,
    0, 3, 1
};
IndexBuffer indexBuffer;

を用意しといて、初期化。

indexBuffer = new IndexBuffer(
    GraphicsDevice,
    IndexElementSize.SixteenBits,
    indices.Length,
    BufferUsage.None
);
indexBuffer.SetData<short>(indices);

vertexBuffer = new VertexBuffer(
    GraphicsDevice,
    typeof(VertexPositionColor),
    vertices.Length,
    BufferUsage.None
);
vertexBuffer.SetData<VertexPositionColor>(vertices);

32bit の定義もあるけど、どうも実行時例外吐いてくれる。
多分、移植性の問題で他デバイスで32bit頂点が使えない場合があるからだと思う。

後はレンダリングの前に指定すればよい。

pass.Apply();

GraphicsDevice.SetVertexBuffer(vertexBuffer);
GraphicsDevice.Indices = indexBuffer;
GraphicsDevice.DrawIndexedPrimitives(
    PrimitiveType.TriangleList,
    0,  //baseIndex
    0,  //minVertexIndex
    vertices.Length,
    0,  //startIndex
    indices.Length / 3
);

追記:
要はデバイス互換モードでビルドすると、32bit頂点が指定できないくさい。