カラーキー

■森を作りたい、でも半透明のテクスチャを使用して、なにも考えずに表示すると

になった経験がありませんか、半透明のテクスチャを使用する時は奥から順に表示しないと、こんな失敗する事になります。
でも、ソートするのは面倒なので、カラーキーという方法を説明します。
カラーキーはテクスチャの指定した色を抜きにするだけでなく、抜き部分をZバッファに書き込まないので、複雑な抜きでもOKというわけです。(ただ、1色指定なので、きれいな抜きにはなりませんが)

■まずはモデルの準備
「Cross.x」というモデルで、板が2枚クロスしたモデルです

xof 0302txt 0064

Mesh {
 8;
 -1.00000; 2.00000; 0.00000;,
  1.00000; 2.00000; 0.00000;,
  1.00000;-1.00000; 0.00000;,
 -1.00000;-1.00000; 0.00000;, 
  0.00000; 2.00000; 1.00000;,
  0.00000;-1.00000; 1.00000;,
  0.00000;-1.00000;-1.00000;,
  0.00000; 2.00000;-1.00000;;
 
 2;
 4;0,1,2,3;,
 4;4,5,6,7;;
 
 MeshTextureCoords {
 8;
 0.00000;0.01000;,
 1.00000;0.01000;,
 1.00000;1.00000;,
 0.00000;1.00000;,
 1.00000;0.01000;,
 1.00000;1.00000;,
 0.00000;1.00000;,
 0.00000;0.01000;;
 }
 MeshMaterialList {
  1;
  2;
  0,
  0;;
  Material {
   1.000000;1.000000;1.000000;1.000000;;
   0.000000;
   0.000000;0.000000;0.000000;;
   0.000000;0.000000;0.000000;;

   TextureFilename {
    "tree.png";
   }
  }
 }
}

「tree.png

プロパティで「Color Key Enable」が「true」になっている事を確認してください。
それと今回は赤い色を抜き指定するので「Color Key Color」が「255.0.0.255」にしてください。
(「R,G,B,A」の順番、Aは255にしておいてください。)

■描画部分のソースです。

protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    //-----------------------------------------------------
    GraphicsDevice.RenderState.AlphaTestEnable = true;
    GraphicsDevice.RenderState.AlphaFunction = CompareFunction.Greater;
    GraphicsDevice.RenderState.CullMode = CullMode.None;
    //----------------------
    for (int j = -4; j < 5; j++)
    {
        for (int i = -4; i < 5; i++)
        {
            mainWorld = Matrix.CreateTranslation(i * 2.0f, 0, j * 2.0f);
            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.View = mainView;
                    effect.Projection = mainProjection;
                    effect.World = mainWorld;
                }
                mesh.Draw();
            }
        }
    }
    base.Draw(gameTime);
}

これでColorKeyの部分が抜ける設定になります。

GraphicsDevice.RenderState.AlphaTestEnable = true;
GraphicsDevice.RenderState.AlphaFunction = CompareFunction.Greater;

今回は面を両面描画に指定します。

GraphicsDevice.RenderState.CullMode = CullMode.None;