.[ ČeskéHry.cz ].
Textura místo obarvení výškové mapy
Jdi na stránku 1, 2  Další
 
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
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 19. listopad 2007, 21:04:52    Předmět: Textura místo obarvení výškové mapy Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 19. listopad 2007, 21:20:50    Předmět: Re: Textura místo obarvení výškové mapy Odpovědět s citátem

Filkon napsal:
vygeneroval jsem si výškovou mapu a obarvil ji barvou.
Tohle jsem moc nepochopil Sad 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Lando



Založen: 29. 07. 2007
Příspěvky: 33
Bydliště: Cestice

PříspěvekZaslal: 19. listopad 2007, 21:29:56    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 19. listopad 2007, 21:48:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 19. listopad 2007, 22:10:10    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 19. listopad 2007, 22:16:45    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 20. listopad 2007, 08:05:05    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 20. listopad 2007, 08:21:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Lando



Založen: 29. 07. 2007
Příspěvky: 33
Bydliště: Cestice

PříspěvekZaslal: 20. listopad 2007, 09:36:35    Předmět: Odpovědět s citátem

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? Wink
2Augi: chybu? nevypnul jsem nasledujici stage? mel jsem za to, ze alphaop i zbyvajici stages jsou automaticky disabled Rolling Eyes uz jsem s tim nejakou chvili nedelal...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 20. listopad 2007, 09:46:17    Předmět: Odpovědět s citátem

Lando: jj, favák Very Happy
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 20. listopad 2007, 10:08:02    Předmět: Odpovědět s citátem

Lando napsal:
2Augi: chybu? nevypnul jsem nasledujici stage? mel jsem za to, ze alphaop i zbyvajici stages jsou automaticky disabled Rolling Eyes 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 20. listopad 2007, 10:21:33    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Lando



Založen: 29. 07. 2007
Příspěvky: 33
Bydliště: Cestice

PříspěvekZaslal: 20. listopad 2007, 11:07:30    Předmět: Odpovědět s citátem

Tak vyreseno. V prvni rade bych se mel omluvit za to, ze jsem te zavedl na scesti. To je samozrejme zasadni chyba, sorry Embarassed
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Filkon



Založen: 19. 11. 2007
Příspěvky: 15

PříspěvekZaslal: 20. listopad 2007, 11:14:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 20. listopad 2007, 14:27:42    Předmět: Odpovědět s citátem

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 Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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