2015-02-15 2 views
0

В Xna я хотел бы нарисовать модель с настраиваемым эффектом. Я бы хотел получить текстуры из сетки.Рисование эффекта XNA с несколькими текстурами

foreach (ModelMesh mesh in model.Meshes) 
 
      { 
 

 
       foreach (ModelMeshPart part in mesh.MeshParts) 
 
       { 
 
        
 

 
        effect.Parameters["World"].SetValue(World); 
 
        effect.Parameters["View"].SetValue(View); 
 
        effect.Parameters["Projection"].SetValue(Projection); 
 
        effect.Parameters["TextureEnabled"].SetValue(true); 
 

 
        
 
        
 
        var basicEffect = part.Effect as BasicEffect; 
 
        if (basicEffect != null) 
 
        { 
 
         Texture2D texName = basicEffect.Texture; 
 
         effect.Parameters["Texture"].SetValue(texName); 
 

 
        } 
 

 
        part.Effect = effect; 
 

 
       } 
 
       mesh.Draw(); 
 

 
      }

модель черного цвета, если я запускаю этот код .. но если я удалю если (BasicEffect! = NULL) она корректно отображается в течение 1 Фрам, но затем появляется Null исключение.

Спасибо

ответ

0

я, наконец, смог получить это право путем изменения кода в том, что:

 Texture2D[] texts = new Texture2D[40000]; 
 
     bool bol = true; 
 
     public void DrawModel(camera cam) 
 
     { 
 

 
      
 

 
      int i = 0; 
 
      foreach (ModelMesh mesh in model.Meshes) 
 
      { 
 

 
       foreach (ModelMeshPart part in mesh.MeshParts) 
 
       { 
 
        effect.Parameters["World"].SetValue(World); 
 
        effect.Parameters["View"].SetValue(View); 
 
        effect.Parameters["Projection"].SetValue(Projection); 
 
        effect.Parameters["TextureEnabled"].SetValue(true); 
 

 

 
        
 
        var basicEffect = part.Effect as BasicEffect; 
 
        if (bol && basicEffect != null) 
 
        { 
 
         texts[i] = basicEffect.Texture; 
 
        } 
 

 
        
 
        effect.Parameters["Texture"].SetValue(texts[i]); 
 
        i++; 
 

 
        part.Effect = effect; 
 
       } 
 
       mesh.Draw(); 
 

 
      } 
 
      bol = false; 
 
     }