Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 19. listopad 2007, 21:04:52 Předmět: Textura místo obarvení výškové mapy |
|
|
Dobrý den. Mám následující problém: vygeneroval jsem si výškovou mapu a obarvil ji barvou. Teď bych chtěl ale místo barvy použít texturu. Můžete mi někdo nějak jednoduše vysvětlit, co pro to musím udělat? (píšu to v directx9 a C#, ale klidně použijte i jiný jazyk) Zkoušel jsem to udělat podle různých tutoriálů, ale bez výsledku. Popíšu vám svůj postup (jsou to úryvky kódu, které se týkají textury):
kód: |
//načtení textury
Texture texTrava = TextureLoader.FromFile(this.device, "trava.jpg");
device.SetTexture(0, texTrava);
device.VertexFormat = CustomVertex.PositionTextured.Format;
vertices[index].Position = new Vector3(2.0f * x, 2.0f * y, heightData[x, y]);
//tady bych čekal, že může být chyba
vertices[index].Tu = (float)x / (float)(WIDTH - 1);
vertices[index].Tv = (float)y / (float)(HEIGHT - 1);
//nastaveni parametru
PresentParameters presentParams = new PresentParameters();
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.AutoDepthStencilFormat = DepthFormat.D16;
presentParams.EnableAutoDepthStencil = true;
presentParams.Windowed = true;
device.RenderState.CullMode = Cull.None;
device.RenderState.ZBufferEnable = true;
//vykreslení
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
|
Světlo i materiál bych měl mít nastaveno dobře, s tou barvou bylo vše zobrazeno v pořádku... Ale teď když zkusím aplikovat texturu, tak se mi celý povrch zabarví jednou barvou a je taková hodně matná, že není skoro rozeznat, kde je kopec.
Pokud byste nepochopili, oč mi jde, můžu poslat i celý kód. díky za vaše reakce... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 19. listopad 2007, 21:20:50 Předmět: Re: Textura místo obarvení výškové mapy |
|
|
Filkon napsal: |
vygeneroval jsem si výškovou mapu a obarvil ji barvou. |
Tohle jsem moc nepochopil Nechtěl jsi spíš říct, že máš model, kde máš u vertexů uloženou barvu?
Jinak by to chtělo vidět právě ten kód na vykreslování, jestli vykresluješ pomocí shaderů nebo FFP a jak tam s tou texturou manipuluješ... |
|
Návrat nahoru |
|
|
Lando
Založen: 29. 07. 2007 Příspěvky: 33 Bydliště: Cestice
|
Zaslal: 19. listopad 2007, 21:29:56 Předmět: |
|
|
Takze jsi mel model s obarvenymi vrcholy, a ted jsi zrusil barvu a misto ni dal texturove koordinaty? (fakt by to chtelo dat celej kod treba sem - http://nopaste.ceske-hry.cz/)
Pokud to takhle je a zaroven vuyzivas vykreslovani pres FFP (ne shadery), tak bych si dal pozor na nastaveni pixelovych operaci FFP. Zkus jenom zobrazit texturu bez osvetleni takhle
kód: |
device.TextureState[0].ColorArgument1 = TextureArgument.Diffuse;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
|
|
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 19. listopad 2007, 21:48:36 Předmět: |
|
|
Tak sem to celý pověsil sem: http://leteckaposta.cz/988934117 Je to kompletně celý projekt ve Visual Studiu. Doufam, že se v tom vyznáte...
Lando: Jo, obarvil sem vrcholy (PositionColored) a pak sem z nich udělal PositionTextured. Zkoušel sem to podle tvé rady, ale krajina je celá bílá. Myslim si, že problém je v určení těch souřadnic Tu a Tv - to sem pořádně nepochopil, jak se počítá... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 19. listopad 2007, 22:10:10 Předmět: |
|
|
Radši než vyvěsit celej projekt je imho lepší hodit relevantní kusy kódu na http://nopaste.ceske-hry.cz/.
Jinak texturovací koordináty představují pozici v textuře, odkud se bude brát barva. Koordinátu [0, 0] ([u, v]) odpovídá levý horní roh textury, koordinátu [1, 1] pravý spodní roh textury.
Vykresluješ teda přes FFP nebo přes shadery? |
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 19. listopad 2007, 22:16:45 Předmět: |
|
|
Augi: aha, nevim, jak to tu chodí a když mam kusy v jiných třídach, tak nevim, jestli by to bylo pochopitelný...
Abych pravdu řek, tak netušim, co je FFP, ale přes shadery určitě nevykresluju...
No zkusim eště přepočítat ty koordináty a uvidim, jestli na něco nepřijdu... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 20. listopad 2007, 08:05:05 Předmět: |
|
|
Stačilo by to podobně, jako jsi to udělal v prvním postu.
FFP je fixed function pipeline a je to to, přes co se vykresluje, pokud nepoužíváš shadery. Jestli teda používáš FFP, tak bys měl nastavit multitexturovací jednotky tak, jak Ti chtěl říct Lando, ale bohužel tam udělal docela zásadní chybu. Zkus tohle, to by Ti mělo zobrazit na modelech jen textury bez osvětlení:
kód: |
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor;
device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1;
device.TextureState[1].ColorOperation = TextureOperation.Disable;
device.TextureState[1].AlphaOperation = TextureOperation.Disable; |
|
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 20. listopad 2007, 08:21:14 Předmět: |
|
|
Tak to taky nezobrazuje dobře. Nevim, jestli v tich posledních dvou řádcích má být device.TextureState[1] nebo device.TextureState[0], zkusil sem obojí - s 1 se vykreslí krajina jednobarevná, celá matně zelená, s 0 celá bílá.
Moje nastavení textury:
kód: |
textura = TextureLoader.FromFile(device, "grass.jpg");
device.SetTexture(0, textura);
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
device.TextureState[0].ColorOperation = TextureOperation.SelectArg1;
device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor;
device.TextureState[0].AlphaOperation = TextureOperation.SelectArg1;
device.TextureState[1].ColorOperation = TextureOperation.Disable;
device.TextureState[1].AlphaOperation = TextureOperation.Disable;
|
A vytvoření pole vrcholů:
kód: |
private void VertexDeclaration()
{
vb = new VertexBuffer(typeof(CustomVertex.PositionTextured), WIDTH * HEIGHT, device,
Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default);
vertices = new CustomVertex.PositionTextured[WIDTH * HEIGHT];
for (int x = 0; x < WIDTH; x++)
{
for (int y = 0; y < HEIGHT; y++)
{
int index = x + y * WIDTH;
vertices[index].Position = new Vector3(2.0f * x, 2.0f * y, heightData[x, y]);
vertices[index].Tu = (float)x / (float)(WIDTH - 1);
vertices[index].Tv = (float)y / (float)(WIDTH - 1);
}
}
vb.SetData(vertices, 0, LockFlags.None);
}
|
Nevim, jestli dobře počítám ty koordinátory... |
|
Návrat nahoru |
|
|
Lando
Založen: 29. 07. 2007 Příspěvky: 33 Bydliště: Cestice
|
Zaslal: 20. listopad 2007, 09:36:35 Předmět: |
|
|
to jak se ti vykresluje krajina cela matne zelena je imho znak spravnyho nastaveni TextureStages, ale spatnyho nastaveni texturovych koordinatu. V tom projektu je dobre nastaveni koordinatu, ale pak je tam este jeden cuklus, kterej je nastavi znova. zkus to dostat zpatky do matne zelenyho stavu a vyhodit ten druhej cyklus.
btw. dalsi favak na CH?
2Augi: chybu? nevypnul jsem nasledujici stage? mel jsem za to, ze alphaop i zbyvajici stages jsou automaticky disabled uz jsem s tim nejakou chvili nedelal... |
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 20. listopad 2007, 09:46:17 Předmět: |
|
|
Lando: jj, favák
Matně zelenou už tam mam, ten cyklus už sem taky vyhodil. Teď ty koordináty počítam takhle:
kód: |
for (int x = 0; x < WIDTH; x++)
{
for (int y = 0; y < HEIGHT; y++)
{
int index = x + y * WIDTH;
vertices[index].Position = new Vector3(2.0f * x, 2.0f * y, heightData[x, y]);
vertices[index].Tu = (float)x / (float)(WIDTH - 1);
vertices[index].Tv = (float)y / (float)(HEIGHT - 1);
}
}
|
Ale stále matně zelená... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 20. listopad 2007, 10:08:02 Předmět: |
|
|
Lando napsal: |
2Augi: chybu? nevypnul jsem nasledujici stage? mel jsem za to, ze alphaop i zbyvajici stages jsou automaticky disabled uz jsem s tim nejakou chvili nedelal... |
To vypnutí dalších stages jsem udělal proto, protože jsem nevěděl, jestli tam s něma nekde nemanipuluje. Jinak by měly snad by default být vypnuté. Ta chyba byla v tom, že Ty jsi napsal TextureArgument.Diffuse, kdežto já TextureArgument.TextureColor (což je imho správně).
Filkon: Zkoušel jsi to debuggovat a zjistit, co za hodnoty ukládáš do těch texturovacích koordinátů? Měly by to být hodnoty mezi nulou a jedničkou (nikoliv nutně). Zkus si ty texturovací koordináty třeba vypsat do Trace. |
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 20. listopad 2007, 10:21:33 Předmět: |
|
|
Augi: Ty čísla sou mezi 0 a 1. Zkusim popsat, jak ta mapa vypadá:
výšková mapa má rozměr 128x128 a zobrazuju ji jako 256x256. Vpravo dole mam souřadnici [0,0], vlevo nahoře [254,254]. Nevim jestli mi tam něco nefalíruje, když ty koordinátory mají souřadnici [0,0] vlevo nahoře a [1,1] vpravo dole. Tu pozici vrcholu nemam normalizovanou, tzn. že sou tam hodnoty od 0 do 254. |
|
Návrat nahoru |
|
|
Lando
Založen: 29. 07. 2007 Příspěvky: 33 Bydliště: Cestice
|
Zaslal: 20. listopad 2007, 11:07:30 Předmět: |
|
|
Tak vyreseno. V prvni rade bych se mel omluvit za to, ze jsem te zavedl na scesti. To je samozrejme zasadni chyba, sorry
Kdyz teda opravis ty dva radky
kód: |
device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
device.TextureState[0].ColorOperation =
TextureOperation.SelectArg1;
//vykresleni site
terrain.RenderMesh(); |
To pocitani texturovych kordinatu funguje (nejsem si uplne jistej, co ma delat ten cyklus za tim...)
kód: |
vertices[index].Tu = (float)x / (float)(WIDTH - 1);
vertices[index].Tv = (float)y / (float)(HEIGHT - 1); |
Posledni vec je, ze jsi zapomnel pri klonovani meshe prenastavit format vertexu na CustomVertex.PositionNormalTextured |
|
Návrat nahoru |
|
|
Filkon
Založen: 19. 11. 2007 Příspěvky: 15
|
Zaslal: 20. listopad 2007, 11:14:36 Předmět: |
|
|
Paráda, díky moc. Taková prkotina a já se s tim mazlim skoro den... To je to hromadný nahrazování, příště si na to dam pozor...
Díky vám oběma, když budu zas něco potřebovat, určitě se zas ozvu... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 20. listopad 2007, 14:27:42 Předmět: |
|
|
Filkon napsal: |
Díky vám oběma, když budu zas něco potřebovat, určitě se zas ozvu... |
Není zač, od toho jsme tady |
|
Návrat nahoru |
|
|
|