Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 22. srpen 2010, 19:36:22 Předmět: Filtering textur v shaderu |
|
|
Ahoj,
měl bych otázku. Pokud vypočítám v shaderu výslednou barvu pixelu, jak mohu aplikovat filtr až "po shaderu"? Například u shadow mapy - tam také nejprve spočtu, jestli je pixel zastíněný, a teprve pak mohu vyhlazovat. Metoda for-cyklu pro X pozic v okolí mi nepřijde zrovna efektivní...
Tedy, je možné tohle provést, případně jsou nějaké minimální nároky na verzi shaderů?
Díky. _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 22. srpen 2010, 22:32:03 Předmět: |
|
|
Můžeš mít jeden velký shader program obsahující oba shadery, tj. výsledek prvního je vstupem pro druhý, nebo to rozložit na víc kroků - víceprůchodový rendering nebo renderováním do textury, která pak bude vstupem pro další část renderování. Výběr závisí na typu efektu a taky na schopnostech grafiky. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 22. srpen 2010, 23:59:49 Předmět: |
|
|
Počkej, takže výstupem prvního shaderu je barva, kterou zpracuje druhý shader... pořád tedy zůstávám u toho, že pro jeden pixel bude muset proběhnout operace několikrát? Nebo je v tom nějaká vtipná pointa, co mi uniká? (0:59 ... ono to není takle v noci težký ) _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 23. srpen 2010, 03:44:14 Předmět: |
|
|
Je nemožný udělat filtering v texturové jednotce až po shaderu. Měl bych 3 řešení:
1) Udělat filtering ručně v shaderu (můžeš ho udělat i lepší než ten bilineární, ale hádám, že bilineární bude stačit). Jednoduchý průměrování je většinou na hovno, pokud nemáš dostatek vzorků (pixelů textury).
2) Použít normálně depth textury (od GL3/D3D10 jsou i float depth textury) a shadow samplery. Shadow samplery se od ostatních samplerů liší tím, že provádějí porovnání hned po čtení z textury automaticky a nabízí i filtrování (to ale taky asi až od GL3/D3D10). Do shaderu pak jde výsledná barva. Něco mi říká, že depth textury v D3D asi nebudou, to teď nevím jistě.
3) Použít funkci známou pod názvem Fetch4 nebo taky Gather4. Funguje to tak, že máš jednokanálovou texturu (pokud máš vícekanálovou, dá se myslím vybrat kanál, ze kterého se čte - závisí na hw podpoře) a do shaderu ti dojde barva ze čtyř vzorků, se kterými by se provedlo bilineární filtrování, do jednoho vec4/float4. Je to v podstatě to samý jako (1), akorát dostaneš 4 vzorky hned naráz. Podpora je až od GL4/D3D11, ale ATI to umí myslím už v GL3 a možná i v D3D10.1.
Pokud máš jednoduché porovnání hloubky s depth texturou a chceš jenom ten filtr, (2) je jasná volba. Pokud jedno z toho máš komplikovanější, pak jedině (3) nebo (1) podle možností.
Samozřejmě klasika už od GL2/D3D9 je dělat všechno v shaderu. D3D9 standardně shadow samplery nemá, takže tam to ani jinak nejde. Normálně si načti vzorky z textury na tebou zvolených pozicích a nakombinuj si to jak chceš. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 23. srpen 2010, 15:40:53 Předmět: |
|
|
Další možné řešení je použít Summed Area Tables, ovšem to už není čistě jen o shaderu ale také o přepočtu textury při načítání do SAT, případně generovat SAT přímo z framebufferů. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
 |
|