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
|
Zaslal: 11. prosinec 2011, 16:52:21 Předmět: XNA - vykreslení modelu s různými texturami. |
|
|
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 |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. prosinec 2011, 17:05:55 Předmět: |
|
|
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 |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 12. prosinec 2011, 13:39:18 Předmět: |
|
|
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 |
|
|
tommy
Založen: 04. 06. 2008 Příspěvky: 31 Bydliště: Praha
|
Zaslal: 15. prosinec 2011, 00:04:26 Předmět: |
|
|
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 |
|
|
cooty125
Založen: 22. 11. 2011 Příspěvky: 40
|
Zaslal: 15. prosinec 2011, 19:13:21 Předmět: |
|
|
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 |
|
|
|