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;

我的问题是更改颜色会影响应该已经绘制的早期实例的颜色。

两张图片,一张带有 if(loop1 > 4) break,第二张没有这两行: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 回答