カラーキー
■森を作りたい、でも半透明のテクスチャを使用して、なにも考えずに表示すると
になった経験がありませんか、半透明のテクスチャを使用する時は奥から順に表示しないと、こんな失敗する事になります。
でも、ソートするのは面倒なので、カラーキーという方法を説明します。
カラーキーはテクスチャの指定した色を抜きにするだけでなく、抜き部分を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;