.[ ČeskéHry.cz ].
XNA - vykreslení modelu s různými texturami.

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
michaldawn



Založen: 26. 02. 2008
Příspěvky: 6
Bydliště: Brno

PříspěvekZaslal: 11. prosinec 2011, 16:52:21    Předmět: XNA - vykreslení modelu s různými texturami. Odpovědět s citátem

Pokusím se popsat můj problém (pro vás to bude jistě maličkost....).
Řekněme, že mám několik kostek. Postupně u každé z nich volám metodu Draw. Její kód je následující:

kód:

public void Draw(GameTime _GameTime, dCamera _Camera)
{
   Matrix worldMatrix = Transform * Entity.WorldTransform;
   
   Model.CopyAbsoluteBoneTransformsTo(m_BoneTransforms);
   foreach (ModelMesh myMesh in Model.Meshes)
   {
       foreach (BasicEffect myEffect in myMesh.Effects)
       {
           myEffect.World = m_BoneTransforms[myMesh.ParentBone.Index] * worldMatrix;
           myEffect.View = _Camera.ViewMatrix;
 
           if (Model.Tag != null && Model.Tag is Texture2D)
           {
             myEffect.TextureEnabled = true;
              myEffect.Texture = (Texture2D)Model.Tag;
           }

           myEffect.Projection = _Camera.ProjectionMatrix;
           myEffect.CurrentTechnique.Passes[0].Apply();

       }
       
       myMesh.Draw();
       
     }
}


Protože každý model kostky má svou texturu uloženou v "TAGu", předpokládal jsem, že každá kostka bude mít jinou texturu. Ale k mému překvapení všechny kostky měli stejnou texturu a to tu, jakou má poslední vykreslovaná kostka. Přitom určitě vím, že v tagách jsou pro jednotlivé objekty opravdu rozdílné textury. Někde jsem četl, že je potřeba provést APPLY, o což jsem se snažil, ale bez úspěchu...

Budu rád za každou radu či připomínku.
Díky.
Cheers!
_________________
Squadra Moravia
http://www.dvorakmichal.eu - osobní stránky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 11. prosinec 2011, 17:05:55    Předmět: Odpovědět s citátem

No ja by som zacal tym, ze rendering by som smaril hned tam, kde mas pass.apply.


Potom by som si pozrel nejaky funkcny sample na BasicEffect - XNA ma jeden velmi pekny sample na to (s tym tankom) a podrobne tu studoval.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 12. prosinec 2011, 13:39:18    Předmět: Odpovědět s citátem

To Apply() volat nemusíš, nemá to na nic vliv, volá se to v tom myMesh.Draw(); automaticky. Podívej se, jestli na řádku myEffect.Texture = (Texture2D)Model.Tag; se nastavují správně různé textury.

Napadá mě ještě jedna věc. Ty kostky s různýma texturama máš ve více modelech = každá textura - nový model, nebo máš jen jeden model kostky a pak si k Tag přichytíš texturu ? Pokud by to bylo takto, pak se sdílí effecty mezi kostkama a může se to vykreslit s jiným texturama, třeba těma posledníma.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
tommy



Založen: 04. 06. 2008
Příspěvky: 31
Bydliště: Praha

PříspěvekZaslal: 15. prosinec 2011, 00:04:26    Předmět: Odpovědět s citátem

Ten Model menis nekde v Update? Spis se mi zda jako globalni promenna, potom by davalo smysl ze tam mas porad tu samou texturu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
cooty125



Založen: 22. 11. 2011
Příspěvky: 40

PříspěvekZaslal: 15. prosinec 2011, 19:13:21    Předmět: Odpovědět s citátem

Pokud chceš mít libovolnou texturu na libovolném modelu, nezávisle na sobě. Zvolil bych cestu přez shader effect. Ukázka na příkladu:

kód:

// Proměnné:
Model myModel;
Texture2D zelena, cervena;
Effect myEffect;
int textura = 1;
Matrix modelWorld;

// LoadContent:
myModel = COntent.Load<Model>(@"models\model"); // Model na který budeme shader aplikovat.
zelena = Content.Load<Texture2D>(@"textures\zelena"); // První textura modelu.
cervena = Content.Load<Texture2D>(@"textures\cervena"); // Druhá textura modelu.
myEffect = Content.Load<Effect>(@"effects\TexturedEffect"); // HLSL shader.
modelWorld = Matrix.Identity * Matrix.CreateTranslation(Vector3.Zero);

// Draw:
foreach (ModelMesh mesh in myModel.Meshes)
{
     foreach (ModelMeshPart part in mesh.MeshParts)
     {
          part.Effect = myEffect;
          myEffect.Parameters["View"].SetValue(myCamera.ViewMatrix);
          myEffect.Paramteres["Projection"].SetValue(myCamera.ProjectionMatrix);
          myEffect.Parameters["World"].SetValue(modelWorld); // Translace a rotace modelu.
          myEffect.Parameters["WorldInverseTranspose"].SetValue(Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * modelWorld));         
          if (textura == 1)
          {
               myEffect.Parameters["Texture"].SetValue(this.zelena);
          }
          else if (textura == 2)
          {
               myEffect.Parameters["Texture"].SetValue(this.cervena);
          }
     }

     mesh.Draw();
}


Soubor: effects\TexturedEffect.fx ke stažení: http://leteckaposta.cz/896082786
_________________
Programátor v C# XNA a 3D Grafik.
http://www.xna.mzf.cz/
http://www.czechcode.hu.cz/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky MSN Messenger
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna