1

私はカタンの開拓者たちに触発されたゲームを作っています。(www.facebook.com/Expanze)同じモデルの何百ものインスタンスをレンダリングするコードを最適化しています。

foreach (ModelMesh mesh in model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.Alpha = 1.0f;
        effect.LightingEnabled = true;
        effect.DirectionalLight0.Direction = GameState.LightDirection;
        effect.DirectionalLight0.DiffuseColor = GameState.LightDiffusionColor;
        effect.DirectionalLight0.SpecularColor = GameState.LightSpecularColor;
        effect.DirectionalLight0.Enabled = true;
        effect.View = GameState.view;
        effect.Projection = GameState.projection;
        for (int loop1 = 0; loop1 < validItems; loop1++)
        {
             if (instance[loop1].Visible)
             {
                  instance[loop1].UpdateEffect(effect, meshNumber);
                  effect.World = transforms[mesh.ParentBone.Index] * instance[loop1].World;

                  mesh.Draw();

                  if(loop1 > 4)
                       break;
             }
        }
    }
    meshNumber++;
}

の : instance[loop1].UpdateEffect(effect, meshNumber);

周囲の色を変更します:effect.AmbientLightColor = playerAmbientLightColor;

私の問題は、色を変更すると、すでに描画されているはずの以前のインスタンスの色に影響することです。

2つの画像、1つはif(loop1> 4)ブレークあり、2つ目はこれらの2行なし:http: //i.imgur.com/DxSKA.jpg

http://i.imgur.com/EjV9f.png

4

1 に答える 1

1

に触発された、またはほぼ同一ですか?ハハハッハッハ。

ここで起こっているのは、呼び出しが延期されており、モデルごとDraw()に同じインスタンスを使用している可能性があります。Effectしたがって、値を設定し、呼び出しDraw(延期、読み取り:後で実行されるまで実行されない)、モデルの切り替え、およびALREADY USEDEffectインスタンスの値の設定を行ってから、Drawを再度呼び出すとどうなりますか。

延期された呼び出しが実行されるとき、それらは(またはそれらの線に沿った何か)にDraw渡された最新の(読み取り:最後の)設定/パラメーターを使用します。Effect

Effect解決策は、モデルごとにそれぞれの新しいインスタンスを作成(クローンなど)することです。

これを引き起こす他の問題がある可能性があります。どの描画モードを使用していますか?XNAの設定は何ですか?これは、人々が遭遇する標準的な問題です。

于 2012-09-17T20:49:04.643 に答える