IndexBuffer
基本は三角ポリゴン制御なので、普通に正方形を作るには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頂点が指定できないくさい。