Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 27. prosinec 2008, 20:48:06 Předmět: HLSL minimalizace počtu instrukcí |
|
|
Zdravím potřetí tentokrát mi to funguje, ale nevím si rady s počtem instrukcí. Chtěl bych to co nejvíce minimalizovat. Podařilo se mi z 32 dostat na 25, ale zajímalo by mě jestli by se dal tento kód ještě nějak upravit?
kód: |
Pixel PS(Vertex vertex)
{
Pixel Output = (Pixel)0;
Output.Color = tex2D(DiffuseTextureSampler, vertex.Coords) * vertex.Color;
float2 XX = CursorPosition - CursorSize;
float2 YY = CursorPosition + CursorSize;
if (vertex.Coords[0] > XX[0] && vertex.Coords[0] < YY[0] &&
vertex.Coords[1] > XX[1] && vertex.Coords[1] < YY[1])
{
float4 Color_t = tex2D(CursorTextureSampler, (vertex.Coords - XX) / (CursorSize * 2));
if (Color_t.r > 0.5)
{
Output.Color = 1 - Output.Color;
}
}
return Output;
} |
V podstatě to dělá to, že na základní texturu to vykreslí ještě jednu texturu (kurzor), který má souřadnice CursorPosition (0-1) a velikost CursorSize tím způsobem, že pouze R složka kurzoru se na podkladové textuře promítne jako invertovaná barva podkladové textury. Lépe je to vidět na obrázku: http://disk.jabbim.cz/matasx@njs.netlab.cz/shader.png
V podstatě to není problém v pravym slova smyslu, ale postupem času přibude víc instrukcí a pak by to problém mohl začít být. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. prosinec 2008, 22:46:58 Předmět: |
|
|
neviem ale asi by som to riesil inak. nemyslim ze cpat tam kod ktory sa vykona len na malom kusku je dobry napad. sice dnes karty zvladaju dynamic branching ale aj tak. sko by som to dal ako jeden dalsi polygon nad ten teren. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 27. prosinec 2008, 23:26:07 Předmět: |
|
|
No tak nad tim sem taky přemejšlel ale to obnáší mnohem víc komplikací a potřebovalo by to ještě větší výpočetní výkon... Ten terén bude rozdělenej na spoustu malejch částí a tenhle shader se bude provádět jen na pár z nich. |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 28. prosinec 2008, 19:09:21 Předmět: |
|
|
Mě se tam nelíbějí ty ifka, na co jsou?
A některý věci (XX, YY, CursorSize * 2, ...) můžeš vypočítat ve vertex shaderu. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 28. prosinec 2008, 19:57:33 Předmět: |
|
|
Jo s tim vertex shaderem dobrej postřeh, ale nechám to radši rovnou vypočítat v hlavnim programu...
no ty ifka... ten první velkej if řeší jestli se právě počítanej pixel nachází v oblasti kurzoru. |
|
Návrat nahoru |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 29. prosinec 2008, 15:20:25 Předmět: |
|
|
Tak proc ten kurzor nevykreslis jako obdelnik jen na tom miste, kde ten kursor je? IFy shaderum rozhodne nedelaji dobre, zvlaste kdyz je ta podminka takhle slozita. Priprava te podminky sezere strasne instrukci.
Kdybys treba udelal tu texturu kursoru tak, aby na krajich byla pruhledna a dal ten kraj opakovat (CLAMP) a ten IF vyhodil, tak zjistis ze se ti do velmi zefektivni. Ale to je jen takovy experiment, lespi je kreslit ten kursor jen na jeho misto, ne vsude.
Barvu muzes invertovat pomoci alpha blendingu. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. prosinec 2008, 15:52:50 Předmět: |
|
|
Ten pixel shader je strašně neefektivní. Vykonává se na všech pixelech daného povrchu, zbytečně. Dělal bych to zvlášť dalším obdélníkem. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 29. prosinec 2008, 17:55:38 Předmět: |
|
|
Ad obdelnik: Kresleni obdelniku nad povrchem je myslim docela out a uz pred lety jsem videl tutorialy, jak kreslit do textury stopy, padle vojacky atd. Obdelnik nebude vypadat cool nad krivym terenem. A navic... myslete taky na lidi, co se chystaji poridit si nVidia 3D Vision
Obrazek pro pripomenuti, jak cool vypada krouzek pod Colossusem ve SC2, kdyz Colossus prekracuje cliff (mam to z youtube, video v plne velikosti mam v Praze, takze obrazek pro pripomenuti. Kdo to video nevidel, nebude z toho obrazku mit nic)
 |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. prosinec 2008, 19:15:07 Předmět: |
|
|
A proč by ten obdelník nemohl kopírovat tvar terénu? Nemusí mít jen 4 vertexy. Vypadá to hodně jako projektovaná textura na terén. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 29. prosinec 2008, 20:45:59 Předmět: |
|
|
No a když hodlám ten terén měnit, tak bych ho musel při každý změně lockovat a podle toho kopírovat data a editovat ten další objekt, kterej bude zobrazovat kurzor. Krom toho to samý budu muset udělat při každý změně pozice nebo velikosti kurzoru. To se mi nezdá jako odlehčení. No ale je fakt že ta velká podmínka bere 13 instrukcí
No a víc už to asi nesmrsknu.
kód: |
Pixel Output = (Pixel)0;
Output.Color = tex2D(DiffuseTextureSampler, vertex.Coords) * vertex.Color;
if (vertex.Coords[0] > XX[0] && vertex.Coords[0] < YY[0] &&
vertex.Coords[1] > XX[1] && vertex.Coords[1] < YY[1])
{
float4 Color_t = tex2D(CursorTextureSampler, (vertex.Coords - XX) / CursorSize2);
if (Color_t.r > 0.5)
{
Output.Color = Color_t;
}
}
return Output; |
|
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. prosinec 2008, 21:38:13 Předmět: |
|
|
Ne, vezmeš si prostě segment terénu, kde to chceš umístit, a ten vykreslíš s průhledností a jiným shaderem na stejné místo (depth test = less/equal). Když dáš kolem toho kurzoru vlastní ořezávací roviny (clip planes), budou se počítat jen ty pixely, kterých se to týká.
Teď co když tam těch kurzorů bude příliš mnoho. Hm, zapeklitý problém... V tom Starcraftu 2 je herní pole jen 2D s nějakou výškou. Takže jdeme projektovat texturu.
1) Přípravíme si ji zhruba o velikosti obrazovky a zajímá nás jen to, co vidí hráč.
2) Vezmeme si komolý jehlan pohledu a ve 2D (shora) spočítáme jeho minimální obalující orientovaný obdélník. To bude pohled, ze kterého budeme do té textury renderovat, s kolmou projekcí samozřejmě.
3) Vyrenderujeme do ní všechny ty kruhy/kolečka/kurzory. Průhlednost si do té textury uložíme přednásobenou (viz premultiplied alpha - to zajistí, že operátor blendingu bude asociativní, tady je to nutnost).
4) Po vyrenderování ji stejným způsobem projektujeme na terén průhlednou, třeba přímo v shaderu toho terénu, není třeba používat blending. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 30. prosinec 2008, 13:44:44 Předmět: |
|
|
Díky, chybama se člověk učí. Aneb doteď jsem nevěděl co to clip planes jsou
Ještě by mě ale zajímalo, jak se s nima pracuje... Plane.Transform se mi zdá být nefunkční. Koukal jsem sem http://www.gamedev.net/community/forums/topic.asp?topic_id=402381 , ale rešení jsem z toho nepochopil. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 30. prosinec 2008, 21:41:00 Předmět: |
|
|
Prostě nastavíš tu "m_Device.ClipPlanes[0].Plane" na rovinu, kterou chceš, aby se to osekávalo. U té roviny je důležitá orientace, protože se tuší ořezávají ty body, pro které vyjde záporné číslo když do rovnice roviny dosadíš pozici. Plane.Transform funguje dobře, možná jí dáváš špatné parametry, možná bude lepší Plane vytvořit jinou metodou... |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 30. prosinec 2008, 23:06:44 Předmět: |
|
|
No jo holdem nejsem zvyklej klepat na linky s textem "Here it is" ... dík
Jo a ještě dodám že mi to stejně nefunguje
Můžu se klidně stavět na hlavu ale ta transformace s tím prostě nic nedělá. A to sem to teď upravil přesně podle toho návodu.  |
|
Návrat nahoru |
|
 |
|