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
|
Zaslal: 14. květen 2009, 03:05:18 Předmět: D3D - 2D Světla pomocí ID3DXSprite ? |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 14. květen 2009, 08:32:32 Předmět: |
|
|
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 |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 14. květen 2009, 08:33:54 Předmět: |
|
|
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 14. květen 2009, 12:12:18 Předmět: |
|
|
Možná jsem to nějak popletl ten popis toho světla když jsem to psal ve 3 ráno
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 14. květen 2009, 12:36:31 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 14. květen 2009, 12:58:45 Předmět: |
|
|
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 14. květen 2009, 14:24:03 Předmět: |
|
|
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 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 doufám že tomu bude někdo rozmět...
Jinak děkuji moc za vaše předchozí odpovědi  |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 14. květen 2009, 14:39:54 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 14. květen 2009, 14:41:05 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 14. květen 2009, 14:46:37 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 14. květen 2009, 16:01:19 Předmět: |
|
|
VladR:
Děkuji za pomoc a za navedení jak dál 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 ale vůbec se mi nelíbí že se to budu muset naučit, už to vidím, vektory matice apod... eeh 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 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í  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 14. květen 2009, 23:18:57 Předmět: |
|
|
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
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
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 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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 15. květen 2009, 03:39:11 Předmět: |
|
|
Děkuji za tipy, určitě se na to podívám
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 ?
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 |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 15. květen 2009, 08:20:59 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 15. květen 2009, 08:42:50 Předmět: |
|
|
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
Jo, a ako hovoril Augi, nezabudni na SetTransform (kasli na update VB)
Instancing mozes pouzit az toto vsetko rozbehas. |
|
Návrat nahoru |
|
 |
|