C#でツールを作る その4 -2Dポリゴン-

3Dの前に軽く2Dをやってみます。


サンプル

DrawUserPrimitives()で描画

まずは頂点バッファを使わずに頂点配列を直接渡します。

  • 2D頂点座標、頂点色
    • CustomVertex.TransformedColored
  • 頂点配列を直接渡す
private void Render()
{
    device.Clear(ClearFlags.Target, Color.FromArgb(0x333333), 1.0f, 0);

    device.BeginScene();

    CustomVertex.TransformedColored[] v = new CustomVertex.TransformedColored[ 4 ];
    v[ 0 ] = new CustomVertex.TransformedColored( 50.0f, 50.0f, 0.0f, 1.0f, Color.Red.ToArgb() );
    v[ 1 ] = new CustomVertex.TransformedColored( 150.0f, 50.0f, 0.0f, 1.0f, Color.FromArgb( 0, 255, 0 ).ToArgb() );
    v[ 2 ] = new CustomVertex.TransformedColored( 150.0f, 150.0f, 0.0f, 1.0f, Color.Blue.ToArgb() );
    v[ 3 ] = new CustomVertex.TransformedColored( 50.0f, 150.0f, 0.0f, 1.0f, Color.Yellow.ToArgb() );

    device.SetTexture( 0, null );
    device.VertexFormat = CustomVertex.TransformedColored.Format;
    device.DrawUserPrimitives(PrimitiveType.TriangleFan, 2, v );


    font.DrawText(null, "hoge", 0, 0, Color.White);

    device.EndScene();

    device.Present();
}

DrawPrimitives()で描画

頂点数が多いモデルを描画する場合はこちらがメインになりますね。

  • 頂点バッファの作成、頂点データの書き込み、破棄
    • GraphicsStream
  • 描画前にデバイスにセット
    • SetStreamSource
public class Hoge : ApplicationContext
{
    /*...*/
    private VertexBuffer vertex = null;
    /*...*/
    private void CreateDeviceObject()
        /*...*/
        
        //
        //頂点バッファを作成して、頂点データを書き込む
        //
        vertex = new VertexBuffer( typeof(CustomVertex.TransformedColored), 4, device, Usage.None, CustomVertex.TransformedColored.Format, Pool.Managed );
        using( GraphicsStream data = vertex.Lock( 0, 0, LockFlags.None ) )
        {
            CustomVertex.TransformedColored[] v = new CustomVertex.TransformedColored[ 4 ];
            v[ 0 ] = new CustomVertex.TransformedColored( 50.0f, 120 + 50.0f, 0.0f, 1.0f, Color.Red.ToArgb() );
            v[ 1 ] = new CustomVertex.TransformedColored( 150.0f, 120 + 50.0f, 0.0f, 1.0f, Color.FromArgb( 0, 255, 0 ).ToArgb() );
            v[ 2 ] = new CustomVertex.TransformedColored( 150.0f, 120 + 150.0f, 0.0f, 1.0f, Color.Blue.ToArgb() );
            v[ 3 ] = new CustomVertex.TransformedColored( 50.0f, 120 + 150.0f, 0.0f, 1.0f, Color.Yellow.ToArgb() );
            data.Write( v );
            vertex.Unlock();
        }
    }

    /*...*/
    private void ReleaseDeviceObject( object sender, EventArgs e )
    {
        if (vertex != null)
        {
            vertex.Dispose();
            vertex = null;
        }
        /*...*/
    }
}
private void Render()
{
    /*...*/
    device.SetStreamSource( 0, vertex, 0 );
    device.SetTexture( 0, null );
    device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
    device.DrawPrimitives( PrimitiveType.TriangleFan, 0, 2 );
    /*...*/
}

テクスチャを貼る

  • テクスチャのロード
    • TextureLoader
  • 2D頂点座標、頂点色、テクスチャ座標
    • TransformedColoredTextured
  • 描画前にデバイスにセット
    • SetTexture
public class Hoge : ApplicationContext
{
    /*...*/

    private Texture texture = null;

    /*...*/

    private void CreateDeviceObject()
    {
        /*...*/

        texture = TextureLoader.FromFile( device, @"..\..\texture\hoge.jpg" );

        /*...*/
    }

    private void ReleaseDeviceObject( object sender, EventArgs e )
    {
        if (texture != null)
        {
            texture.Dispose();
            texture = null;
        }

        /*...*/
    }
}
CustomVertex.TransformedColoredTextured[] v = new CustomVertex.TransformedColoredTextured[ 4 ];
v[ 0 ] = new CustomVertex.TransformedColoredTextured( x0, y0, 0.0f, 1.0f, Color.White.ToArgb(), u0, v0 );
v[ 1 ] = new CustomVertex.TransformedColoredTextured( x1, y1, 0.0f, 1.0f, Color.White.ToArgb(), u1, v1 );
v[ 2 ] = new CustomVertex.TransformedColoredTextured( x2, y2, 0.0f, 1.0f, Color.White.ToArgb(), u2, v2 );
v[ 3 ] = new CustomVertex.TransformedColoredTextured( x3, y3, 0.0f, 1.0f, Color.White.ToArgb(), u3, v3 );
private void Render()
{
    /*...*/

    device.SetTexture( 0, texture );
    /*描画();*/

    /*...*/
}