.[ ČeskéHry.cz ].
D3D - 2D Světla pomocí ID3DXSprite ?
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
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 14. květen 2009, 03:05:18    Předmět: D3D - 2D Světla pomocí ID3DXSprite ? Odpovědět s citátem

Dobrý den,

Chtěl bych se zeptat jestli existuje nějaký způsob jak přidat světla do 2D hry která používá D3D místo DirectDraw.

Používám ID3DXSprite interface pro vykreslování 2D grafiky, a zkoušel jsem to přes alpha blending ale nedosáhl jsem potřebný efekt světla:

SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

Světlo mám uloženo v 32 bit bitmapě, je to světlo je ve tvaru elipsy a má alfa kanál.

Pokud světlo vykreslím pomocí alpha blendingu tak výsledek je že objekty v dosahu světla jsou zašedlé, ale potřeboval bych aby se rozsvítily a zvýšily intenzitu barev.

Možná by to šlo i pomocí alpha blendingu, ale netuším jak nastavit zařízení abych dosáhnul tento efekt...

Děkuji za případné odpovědi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 14. květen 2009, 08:32:32    Předmět: Odpovědět s citátem

Zkusil jsi additive blending (scitaci)? Obrazek svetla pak nema alpha-kanal, je to jen barevne kolecko/elipsa na cernem pozadi - v mistech pokrytych jeho cernymi oblastmi se nic nemeni (zdroj + cerna = zdroj), v obarvenych se ke scene prida prisl. barva.
_________________
Award-winning game developer
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: 14. květen 2009, 08:33:54    Předmět: Odpovědět s citátem

koukni na tohle: http://msdn.microsoft.com/en-us/library/bb173417(VS.85).aspx

Důležitej je tam ten vzoreček: Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor

Z toho je myslím docela dobře vidět, jak nastavit parametry blendingu, abys dosáhl Tebou požadovaného efektu. Nevím přesně, jaks to myslel, ale pokud chceš jen zvýšit intenzitu podle alphy, pak by mohlo fungovat toto:

SetRenderState (D3DRS_SRCBLEND, D3DBLEND_ONE); // původní barva
SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // přičíst barvu textury světla podle alphy v textuře

Textura se světlem bude mít tedy v RGB barvu světla a v alpha kanálu bude informace, jak hodně bude tato barva aplikována. Možná budeš muset použít místo D3DBLEND_INVSRCALPHA hodnotu D3DBLEND_SRCALPHA - záleží na tom, jaký význam má u Tebe aplha kanál.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 14. květen 2009, 12:12:18    Předmět: Odpovědět s citátem

Možná jsem to nějak popletl ten popis toho světla když jsem to psal ve 3 ráno Smile

Tady je obrázek toho světla:


Je to vyplněná elipsa, po načtení se automaticky ten obrázek převede do 32 bit a jako průhlednou barvu se zvolí první barva v paletě, tedy ta modrá...

Zkoušel jsem to tak jak jsi mi to napsal, Augi, tedy, akorá že ten první způsob neudělal žádný efekt tak jsem to zkusil takhle:

kód:
SetRenderState (D3DRS_SRCBLEND, D3DBLEND_ONE);
SetRenderState (D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);


No a ted už to vypadá lépe, střed elipsy je tmavší a čím dále od středu tak tím méně intenzity.

Problém je v tom že se ten efekt aplikuje na všechny textůry, samozřejmě jsem zkoušel to nastavení vrátit zpět po vykreslení toho světla:
kód:

SetRenderState (D3DRS_SRCBLEND, D3DBLEND_ONE);
SetRenderState (D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);

D3DXSprite.Draw(Texture, nil, nil, @Vector, D3DCOLOR_ARGB(255, 255, 255, 255));

SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);


Jenže takhle to nastavování nemá žádný efekt, vykreslí se normálně bez bledingu...

Takže otázka možná zní kdy to světlo vykreslit, před vykreslením těch objektů které chci osvětlil a nebo až vykreslím ty objekty, vždycky jsem zkoušel tu druhou variantu...
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: 14. květen 2009, 12:36:31    Předmět: Odpovědět s citátem

Pokial sa ti to aplikuje na vsetky ostatne textury, tak si len myslis ze to disablujes ale v skutocnosti nie. Prejdi si to v debuggeri krok po kroku, aby si zistil, kde v kode to tam mas zabudnute.

Predpokladam, ze ako lightmapu pouzivas texturu c.1, cize ju musis disablnut po vyrenderovani danych objektov cez m_pd3dDevice->SetTexture (1,NULL).

Patrilo by sa, aby si vratil renderstaty do stavu, v akom boli pred renderovanim s lightmapou, inak sa budes donekonecna borit s problemom, ze preco ti zrazu jeen efekt zblbne desat dalsich veci s priehladnostou.

Odporucam si spravit triedu, ktora vrati do default stavu vsetky render states (ak mas Pure device, tak getdefault calls nefunguju) a to pouzivaj vzdy po kazdom pouziti priehladnosti.
Zabijes s tym sice 2 hodiny (vratane copy/paste default stavov z dx dokumentacie), ale vo vysledku si usetris dni debugovania, tomu ver...

Inak, v pripade, ze chces robit taketo veci, ako zvysovanie jasu a podobne, tak na to sluzi nastavovanie ColorOps a AlphaOps texture renderstates - teda operandy D3DX_MODULATE,2X,4X,ADD.

Farba pixelu na obrazovke je pri blendingu vo vysledku zavisla aj na color ops, teraz tam mas zrejme nejaky default typu SELECT_ARG1 alebo nieco take.
Na toto ti inak odporucam si spravit maly testovaci projektik s par texturami, kde si budes prepinat jednotlive mody a vies sa k tomu vzdy vratit ked potrebujes, co bude asi vzdy, kedze je to zaklad miesania farieb Smile
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: 14. květen 2009, 12:58:45    Předmět: Odpovědět s citátem

No záleží čeho přesně chceš dosáhnout. Původně jsem myslel, že máš vykreslenou celou scénu a do ní chceš umístit světla (tedy zesvětlit/ztmavit určité části obrazovky). Na to se hodí alpha blending.

Pokud chceš ale při vykreslování jednoho spritu na něj zároveň aplikovat nějakou další texturu se světlem, tak budeš muset použít texture blending:
http://msdn.microsoft.com/en-us/library/bb206240(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb206241(VS.85).aspx

Tady si ale nejsem moc jistej, jestli Ti bude stačit vykreslování přes ten standardní ID3DXSprite - např. kvůli tomu, že budeš chtít, aby nebyly obě textury přesně přes sebe, ale aby jedna byla třeba nějak posunutá. Ale napsat si vlastní ID3DXSprite není nic složitého - pro začátek stačí vykreslovat dva trojúhelníky složené z vertexů, které mají dva texturovací koordináty (jedny pro původní texturu, druhý pro texturu se světlem).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 14. květen 2009, 14:24:03    Předmět: Odpovědět s citátem

Ano Augi, přesně takhle to mám, tedy mám vykreslenou celou scénu a do ní chci umístit světla, asi jsem to předtím špatně vysvětlil Sad promiň.

Tak už jsem zjistil kde byl problém, ten sprite mi blokoval SetRenderState protože jsem zřejmě vykresloval celou scénu pomocí jednoho ID3DXSprite, volal begin a end jen jednou za snímek a volal SetRenderState uvnitř begin a end.

Takže jsem přešel na textůrované obdelníky, a problém je vyřešen, pro vyrenderovaní světla nastavuji:

kód:

SetRenderState (D3DRS_DESTBLEND, D3DBLEND_ONE);

Vykreslím a vrátím zpět

SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);


Ted by mě zajímala rychlost, používám hodně textůr, takže musím volat SetTexture pro každou objekt který renderuji, tuším že se ten problém řeší tím že se ty bitmapy zkopírují do jedné velké takže se nemusí tolikrát volat SetTexture.

Zajímalo by mě jestli rychlost funkce SetTexture závisí na velikosti té textury v parametru, tedy jestli se bude funkce SetTexture provádět déle když budu mít rozlišení 2048x2048 a nebo 512x512.

Dále by mě zajímalo jak ty texturované obdelníky rychle vykreslovat, dělám to ted takhle:

kód:
SetTexture(0, SpriteFrame^.Texture);
SetFVF(D3DFVF_TLVERTEX);
DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, Verts[0], sizeof(TSpriteVertex));


Četl jsem někde že funkce DrawPrimitiveUP je pomalá a neměla by se používát, a že by se měl používat raději vertex buffer, zajímalo by mě proto jestli by šlo přes ten vertex buffer udělat nějaký "batch", kde bych ho zamykal a odemykal jen jednou, a nebo to musím udělat pro každou texturu zvlášt ?

Ještě by mě zajímalo jestli se mám nějak obávat o snížení fps pokud budu vykreslovat ty textůry i částečně mimo viditelnou část, protože u ID3DXSprite jsem používal ořezávání té textůry pomocí RECT takže jsem nevykresloval mimo viditelnou část obrazovky, u těch textůrovaných obdelníků jsem zkoušel ty textůry ožíznout ale vždycky byly spíše deformované než oříznuzté.

Nakonec, zpět k těm světlům, dala by se tam nějak nastavit intenzita ? u sprite jsem to dělal přes hodnotu alfy, kde jsem jí nastavoval od 128 do 255, jenže u těch obdelníků to bude asi složitější že ? A co takhle barva toho světla ?

Panejo, to jsem toho napsal Smile doufám že tomu bude někdo rozmět...


Jinak děkuji moc za vaše předchozí odpovědi Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 14. květen 2009, 14:39:54    Předmět: Odpovědět s citátem

Barvu a intenzitu vyresis nasobeni dalsi barvou, kterou muzes vzit odkudkoli. Napr. barva=zluta a intenzita=50% znamenaji vynasobit tmave zlutou (rgb 128,128,128) (kdyz puvodni textura ma jen stupne sedi rgb 0,0,0 az rgb 255,255,255).
_________________
Award-winning game developer


Naposledy upravil Ladis dne 14. květen 2009, 14:41:41, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



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

PříspěvekZaslal: 14. květen 2009, 14:41:05    Předmět: Odpovědět s citátem

Len v rychlosti - kedze sa pytas na rychlost kvoli nastavovaniu textury pred kazdym renderovanim - hovori sa tomu texture atlas (pogoogluj pre zaujimavost) a zatial na to zabudni, kym sa hras so zakladnymi vecami ako render states a blending.

Ono je to sice jednoduche a vies si to napisat za vikend, ale momentalne riesis problem to vobec rozbehat, nieze aby to malo o 37 fps viac, to je pre teba teraz nepodstatne.

Intenzitu svetla si vies natavit napr. cez farbu vertexu a potom, v ramci multitexturing cascade zvolis prvy argument (Select_arg1) ako D3DTA_TEXTURE a druhy D3DTA_DIFFUSE. Ako ColorOp nastavis D3DTOP_MODULATE (ale mozes sa pohrat aj s inymi aby si videl co vlastne robia).

Ohladom rychlosti pouzivania/lockovania VB -nVidia na to vydala celkom slusne PDFko/PPTcko - skus pohladat na jej strankach v developerskej sekcii, zhruba 5 rokov stare to je - a tam to mas vsetko pekne popisane, ze aky vykon ti poskytnu dynamicke VB, a s akymi flagmi ich mas pouzivat.

Ale hovorim, to je zatial zbytocny overkill na teba. Rozchod to najprv, potom si pohladaj ten dokument, prestuduj a prid sa sem opytat na konkretne veci z neho.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



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

PříspěvekZaslal: 14. květen 2009, 14:46:37    Předmět: Odpovědět s citátem

Este k tej rychlosti ohladom DIPUP - vo vseobecnosti plati, ze to co si cital na forach pisane pred 5-8 rokmi uz davno nie je pravda (nemyslim teraz len to DIPUP, ale cokolvek).

Driver nie je blby, ma nejaku heuristiku a vidi, ze s tym nic nerobis, takze sa to nakoniec moze prejavit tak, ze sice realne v tvojom pripade neuvidis ziaden rozdiel (pokial sa bavime o framerate do 60 fps),ale rozdiel by si videl iba ak by ta zaujimal framerate 500+.

Je samozrejme kopec veci, ktore platia stale, ze su pomale:
- switchovanie render targets
- switchovanie shaderov
- switchovanie textur
- CPU overhead drivera pri volani DIP
- X dalsich

Pozri si sekciu nVidie Developer`s corner (ci ako sa to teraz vola) a tam najdes kvanta PDFiek ohladom toho, co v ktorom directXe je pomale. Ten overhead je iny pod DX8, pod DX9 a pod DX10.


Pokial si tie PDFka este nestudoval, tak tam mas materialu na studovanie a otazky na dalsie 3 roky Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 14. květen 2009, 16:01:19    Předmět: Odpovědět s citátem

VladR:
Děkuji za pomoc a za navedení jak dál Smile Ty pdfka jsem ještě nestudoval, jsem odkojený na DirectDraw, na direct3d jsem sáhl jen proto že už není tak podporovaný a asi úplně zanikne kvůli D2D Smile ale vůbec se mi nelíbí že se to budu muset naučit, už to vidím, vektory matice apod... eeh Very Happy matika.

Ladis:
Tak barvy jsem už přidal a i intenzitu, předtím mi to nešlo protože jsem neměl D3DFVF_DIFFUSE ve vertexu. Děkuji za radu.

Augi:
Zjistil jsem že budu muset použít i ten texture alpha blending, když budu potřebovat třeba simulovat světlo z krbu, kde mám bitmapu ohně, a nebo u svícnu Smile Takže děkuji za radu...

Jinak děkuji všem, jsem rád že jsem se připojit do téhle komunity, a doufám že v budoucnu budu i nápomocný a pomůžu i takovým zelenáčům jako jsem já... to jsem to ale naivní Razz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



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

PříspěvekZaslal: 14. květen 2009, 23:18:57    Předmět: Odpovědět s citátem

Nouma: Předem bych zdůraznil to, co už psal VladR - nejprve to rozběhej a pak teprve řeš nějaké složitější optimalizace výkonu. Nakonec totiž třeba zjistíš, že je vůbec nebudeš potřebovat a ušetříš si tím čas Smile
Nouma napsal:
Ted by mě zajímala rychlost, používám hodně textůr, takže musím volat SetTexture pro každou objekt který renderuji, tuším že se ten problém řeší tím že se ty bitmapy zkopírují do jedné velké takže se nemusí tolikrát volat SetTexture.
Jak psal VladR, této technice se říká většinou texture atlas a díky ní můžeš ušetřit hodně volání SetTexture, které je opravdu náročné.
Pokud nezáleží, v jakém pořadí budou textury vykresleny, tak je dobrou jednodušší optimalizací seřadit všechny sprity podle použité textury. Když pak vykresluješ za sebou sprity se stejnou texturou, tak nemusíš pro každý sprite volat znovu SetTexture Smile

Nouma napsal:
Zajímalo by mě jestli rychlost funkce SetTexture závisí na velikosti té textury v parametru, tedy jestli se bude funkce SetTexture provádět déle když budu mít rozlišení 2048x2048 a nebo 512x512.
IMHO nezáleží.

Nouma napsal:
Dále by mě zajímalo jak ty texturované obdelníky rychle vykreslovat, dělám to ted takhle:

kód:
SetTexture(0, SpriteFrame^.Texture);
SetFVF(D3DFVF_TLVERTEX);
DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, Verts[0], sizeof(TSpriteVertex));


Četl jsem někde že funkce DrawPrimitiveUP je pomalá a neměla by se používát, a že by se měl používat raději vertex buffer, zajímalo by mě proto jestli by šlo přes ten vertex buffer udělat nějaký "batch", kde bych ho zamykal a odemykal jen jednou, a nebo to musím udělat pro každou texturu zvlášt ?
Tohle je jedna z těch optimalizací, kterou bych zatím možná odložil. Ale v zásadě je řešení jednoduché - vytvořit normální statický vertex buffer, napchat do něj čtyři vertexy a ty prostě vykreslovat. S pozicemi vertexů i texturovacích koordinátů pak můžeš hýbat pomocí transformačních matic ([url=http://msdn.microsoft.com/en-us/library/bb174463(VS.85).aspx]SetTransform[/url]). To je první přiblížení. Druhé přiblížení spočívá v odstranění přílišného volání DrawPrimitive. To spočívá právě v tom, že se naakumuluje dávka několika spritů k vykreslení a ty se pak všechny vykreslí naráz pomocí jediného volání DrawPrimitve. Této technice se říká instancing. Je více způsobů, jak ho implementovat, např. je možné si předat informace o transformacích do vertex shaderu přes konstantní registry a pak si je číst z vertex shaderu samotného...

Nouma napsal:
Ještě by mě zajímalo jestli se mám nějak obávat o snížení fps pokud budu vykreslovat ty textůry i částečně mimo viditelnou část, protože u ID3DXSprite jsem používal ořezávání té textůry pomocí RECT takže jsem nevykresloval mimo viditelnou část obrazovky, u těch textůrovaných obdelníků jsem zkoušel ty textůry ožíznout ale vždycky byly spíše deformované než oříznuzté.
Při programování (nejen) grafiky platí, že největší optimalizace je taková, když se něco vůbec nemusí udělat Smile Takže jediné, co bych na Tvém místě udělal, by bylo to, že před vykreslením spritu bych otestoval, jestli jeho plocha nějak zasahuje do obrazovky. O nějaké ořezání půlky spritu se už myslím postará docela efektivně hardware sám při rasterizaci.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 15. květen 2009, 03:39:11    Předmět: Odpovědět s citátem

Děkuji za tipy, určitě se na to podívám Smile

S tím vertex bufferem, vytvořil jsem si jeden o velikosti 4 vertexů, a jelikož potřebuji jen jeden tak jsem nastavil ten typ vextexu, zdroj bufferu, koordináty textůry (tu tv) apod... jen jednou na začátku:

kód:
D3DDevice.SetFVF(D3DFVF_TLVERTEX);
D3DDevice.SetStreamSource(0, D3DVertexBuffer, 0, SizeOf(TSpriteVertex));


No a byl jsem nemile překvapen, fps mi kleslo z 600 na 80 když to srovnám s metodou DrawPrimitiveUP... u ID3DXSprite jsem měl fps taky vyšší ale né o moc, takže by mě zajímalo pročpak se to tak rapidně zpomalilo... a to jedu v hardware módu (D3DCREATE_HARDWARE_VERTEXPROCESSING).

Jediné co dělám jinak oproti metody DrawPrimitiveUP je to že odemykám a zamykám ten vertex buffer, zjistil jsem ale že je to problém ve volání DrawPrimitive protože když tu funkci zavolám tak jí to trvá dlouho než se provede, takže jsem bud někde zapomněl něco nastavit a nebo že by to byla nějaká brutální chyba v kódu ?Very Happy

Jinak tu optimalizaci s atlasem jsem chtěl vyzkoušet, převedl jsem ty bitmapy stejného druhu do velkých textůr, například jako první v té hře vykresluji dlaždice, mám okolo 1000 různých druhů, takže jsem to převedl to jedné velké textůry 2048x2048, jenže jsem nepřišel na to jak nastavit ty vertexy tak aby vykreslily tu část textůry která se má vykreslit.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



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

PříspěvekZaslal: 15. květen 2009, 08:20:59    Předmět: Odpovědět s citátem

A proč odemykáš a zamykáš vertex buffer? To je určitě velká brzda. Místo toho, abys zapisoval pozici spritu přímo do vertexu, tak bys to měl zadávat pomocí transformací (SetTransform). Příp. zkusit vytvořit vertex buffer jako dynamický (parametr při vytváření vertex bufferu).
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: 15. květen 2009, 08:42:50    Předmět: Odpovědět s citátem

Nouma napsal:

S tím vertex bufferem, vytvořil jsem si jeden o velikosti 4 vertexů, a jelikož potřebuji jen jeden tak jsem nastavil ten typ vextexu, zdroj bufferu, koordináty textůry (tu tv) apod... jen jednou na začátku:

kód:
D3DDevice.SetFVF(D3DFVF_TLVERTEX);
D3DDevice.SetStreamSource(0, D3DVertexBuffer, 0, SizeOf(TSpriteVertex));
Toto je v poriadku.

Nouma napsal:

No a byl jsem nemile překvapen, fps mi kleslo z 600 na 80 když to srovnám s metodou DrawPrimitiveUP... Jediné co dělám jinak oproti metody DrawPrimitiveUP je to že odemykám a zamykám ten vertex buffer
To je jasne, pokial to lockujes/unlockujes kazdy 1 frame. Lock VB sposobi,ze CPU sa musi synchronizovat s GPU, cize medzitym sa nic nespracuvava. Lock je rozhodne operacia narocna na vykon, paradoxne prave tym, ze sa pocas nej nic nepocita.
Dvojnasob, ak lockujes staticky a nie dynamicky VB.

Nouma napsal:

zjistil jsem ale že je to problém ve volání DrawPrimitive protože když tu funkci zavolám tak jí to trvá dlouho než se provede
Pozor na taketo profilovanie, lebo takto vidis casto len dosledok niecoho predosleho. Radsej si zozen nejaky PIX alebo iny profilovaci nastroj, ktory ti presne povie, kde sa co deje (CPU/GPU) pekne pocas celeho framu, ak uz chces vediet presne.

Nouma napsal:

Jinak tu optimalizaci s atlasem jsem chtěl vyzkoušet, převedl jsem ty bitmapy stejného druhu do velkých textůr, například jako první v té hře vykresluji dlaždice, mám okolo 1000 různých druhů, takže jsem to převedl to jedné velké textůry 2048x2048, jenže jsem nepřišel na to jak nastavit ty vertexy tak aby vykreslily tu část textůry která se má vykreslit.
No musis si UV koordinaty upravit tak, aby vykreslovali dany usek textury.
Cize ak mas texturu 2048x2048 a v nej mas nejaky material o rozmeroch 128x96 na pozicii (1024,512), tak mas UV koordinaty vertexov:
(1024/2048 , 1.0 - (512/2048) )
(1024/2048 + 128/2048 ,1.0 - (512/2048))
(1024/2048 + 128/2048 ,1.0 - (512/2048 + 96/2048) )
(1024/2048 ,1.0 - (512/2048 + 96/2048) )

Musis si dat pozor na dve veci hlavne (je ich viac, ale tieto dve su najdolezitejsie):
1. Materialy v texture nesmu byt hned vedla seba, inak ti pocas filteringu mipmap bude blendovat na hranach medzi materialmi texely z vedlajsej textury - co je logicke vzhladom na to, ako filterin funguje - vid dx docs

2. Pozor na Half-Texel offset. Precitaj si v dx docs ako to funguje. Princip je, ze realna - fyzicka pozicia kazdeho UV koordinatu je v skutocnosti v strede daneho texelu. Najlepsie to uvidis, ak mas texturu 2x2, alebo 4x4, pricom kazdy texel ma inu farbu a normalne uvidis, ze pozicia (0.0,0.0) je fakt v strede toho texelu. Ale to treba vidiet. Na velkych texturach 128+ si ten pol texel ani nevsimnes, ale moze ti to robit psie kusy, takze pozor aj na to.

Na druhej strane, raz nastvis texturu pred renderovanim a nestaras sa. Driver tiez moze pristup k tej texture zoptimalizovat interne, aby bol rychlejsi pristup pocas fetchovania texelov, takze to za to stoji.

Len si nie som isty, ci zrovna v tomto momente. Ale je chvalyhodne, ze ta ten vykon tak zaujima Smile

Jo, a ako hovoril Augi, nezabudni na SetTransform (kasli na update VB) Wink
Instancing mozes pouzit az toto vsetko rozbehas.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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