.[ ČeskéHry.cz ].
HLSL minimalizace počtu instrukcí
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
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 27. prosinec 2008, 20:48:06    Předmět: HLSL minimalizace počtu instrukcí Odpovědět s citátem

Zdravím potřetí Very Happy 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 27. prosinec 2008, 22:46:58    Předmět: Odpovědět s citátem

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



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 27. prosinec 2008, 23:26:07    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 28. prosinec 2008, 19:09:21    Předmět: Odpovědět s citátem

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



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 28. prosinec 2008, 19:57:33    Předmět: Odpovědět s citátem

Jo s tim vertex shaderem dobrej postřeh, ale nechám to radši rovnou vypočítat v hlavnim programu... Smile

no ty ifka... ten první velkej if řeší jestli se právě počítanej pixel nachází v oblasti kurzoru.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



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

PříspěvekZaslal: 29. prosinec 2008, 15:20:25    Předmět: Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. prosinec 2008, 15:52:50    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 29. prosinec 2008, 17:55:38    Předmět: Odpovědět s citátem

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 Smile

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



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. prosinec 2008, 19:15:07    Předmět: Odpovědět s citátem

A proč by ten obdelník nemohl kopírovat tvar terénu? Nemusí mít jen 4 vertexy. Smile Vypadá to hodně jako projektovaná textura na terén.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 29. prosinec 2008, 20:45:59    Předmět: Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. prosinec 2008, 21:38:13    Předmět: Odpovědět s citátem

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



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 30. prosinec 2008, 13:44:44    Předmět: Odpovědět s citátem

Díky, chybama se člověk učí. Aneb doteď jsem nevěděl co to clip planes jsou Smile

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
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: 30. prosinec 2008, 21:41:00    Předmět: Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. prosinec 2008, 21:56:27    Předmět: Odpovědět s citátem

Matasx napsal:
Koukal jsem sem http://www.gamedev.net/community/forums/topic.asp?topic_id=402381 , ale rešení jsem z toho nepochopil.


Na tom gamedevu na konci diskuze je přece odkaz na tento článek, kterej to jasně vysvětluje: http://www.mdxinfo.com/resources/hlslclipplanes.php
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 30. prosinec 2008, 23:06:44    Předmět: Odpovědět s citátem

No jo holdem nejsem zvyklej klepat na linky s textem "Here it is" ... dík Wink
Jo a ještě dodám že mi to stejně nefunguje Very Happy
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. Crying or Very sad
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