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: 24. srpen 2008, 12:05:39 Předmět: Barvy v HLSL |
|
|
Mám zase další dotaz ohledně HLSL. Možná že kdybych víc hledal, že bych se dopátral řešení, ale sem línej a možná tu budu mít víc dotazů.
Takže, potřebuju prostě napsat klasickou funkcionalitu pixel shaderu. Aby sloučil barvu textury s barvou pixelu danou barvou vertexů.
kód: |
//barva z pixelu textury
tex2D(ColoredTextureSampler, PSIn.TexCoords);
//barva z vertexů
PSIn.Color;
//výstup
Output.Color = ?; |
Poradí někdo? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 24. srpen 2008, 12:18:34 Předmět: |
|
|
Krása shaderů je v tom, že si tam můžeš hodně věcí udělat podle libosti (samozřejmě v rámci určitých mezí). Takže hlavně záleží na tom, co myslíš tím sloučením barev.
Sečtení: Output.Color = PSIn.Color + tex2D(ColoredTextureSampler, PSIn.TexCoords);
Vynásobení: Output.Color = PSIn.Color * tex2D(ColoredTextureSampler, PSIn.TexCoords);
Obě operace proběhnou "samostatně" pro každý kanál (RGBA). Pokud chceš manipulovat s jednotlivými složkami samostatně, můžeš použít subskripci RGBA nebo XYZW (viz DX SDK). Např. Output.Color.r = PSIn.Color.b + tex2D(ColoredTextureSampler, PSIn.TexCoords).g; |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 24. srpen 2008, 12:25:17 Předmět: |
|
|
Jj to vím, mě jde právě o to, aby to vypadalo přesně tak, jako bych shadery nepoužil... Přičítání není to pravý. Násobení vypadá líp. |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 24. srpen 2008, 12:30:59 Předmět: |
|
|
No pak záleží na tom, jak jsi měl nastavenou fixní pipeline (asi hlavně texturovací jednotky).
Btw. teď budu asi dva dny mimo, tak nebudu reagovat... |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 24. srpen 2008, 13:09:49 Předmět: |
|
|
A jak na průhlednost? Dá se v pixel shaderu zjistit původní barva pixelu na tom místě? |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. srpen 2008, 14:21:26 Předmět: |
|
|
To, cos předtím udělal, jsou triviální a přesto důležité operace. Součet ti sečte barvy, např. šedá+šedá=bílá, červená+zelená=žlutá, použití je např. když máš více světel, tak sčítáš jejich intenzity. Násobení v zásadě obarvuje bílá*barva=barva, černá*barva=černá, typické použití je při skládání různých vlastností, např. obarvený otexturovaný a osvětlený model dostaneš vynásobením barva*barvaTextury*intenzitaSvětla*barvaSvětla.
Zjistit barvu ve framebufferu nejde. To je právě ta část pipeline, která zatím není tak úplně programovatelná, jsou na to specializované ROP jednotky. Na to musíš blendingem a ten má konečnou množinu stavů, které nastavíš jako RenderState. Můžeš nastavit rovnici blendingu a parametry source a destination, ovšem ta rovnice se omezuje jen na pár základních operací. Nicméně pokud některý z parametrů zavisí na alpha kanálu, můžeš v pixel shaderu minimálně ovlivnit hodnotu alphy. I tak si ale v pixel shaderu můžeš hrát s průhledností, pokud k tomu nepotřebuješ znát stávající pixel ve framebufferu, např. máš 2 textury a chceš, aby jedna byla natažená přes druhou jako průhledná, to uděláš textura1*(1 - textura2.a) + textura2*textura2.a. To by asi tak byly základy. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 24. srpen 2008, 14:30:43 Předmět: |
|
|
Díky. Vyřešeno. |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 24. srpen 2008, 15:15:12 Předmět: |
|
|
Matasx napsal: |
Díky. Vyřešeno. |
MODERATOR: a reseni? - je skvely ze tys problem vyresil, ale forum je od toho aby tu taky ty odpovedi byly, takze kdyz uz pises "vyreseno" bud te lasky a reseni tu popis |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 24. srpen 2008, 16:10:07 Předmět: |
|
|
Řešení:
kód: |
pass Pass0
{
AlphaBlendEnable = True;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
VertexShader = compile vs_2_0 SimplestVertexShader();
PixelShader = compile ps_2_0 OurFirstPixelShader();
} |
Snad hned nebude tak zle, ne? |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. srpen 2008, 19:59:14 Předmět: |
|
|
Je to dobře, vidím, že ses naučil využívat sílu těch "efektů"... _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|