.[ ČeskéHry.cz ].
Barvy v HLSL

 
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: 24. srpen 2008, 12:05:39    Předmět: Barvy v HLSL Odpovědět s citátem

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ů. Smile
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
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: 24. srpen 2008, 12:18:34    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 24. srpen 2008, 12:25:17    Předmět: Odpovědět s citátem

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
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: 24. srpen 2008, 12:30:59    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 24. srpen 2008, 13:09:49    Předmět: Odpovědět s citátem

A jak na průhlednost? Dá se v pixel shaderu zjistit původní barva pixelu na tom místě?
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: 24. srpen 2008, 14:21:26    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 24. srpen 2008, 14:30:43    Předmět: Odpovědět s citátem

Díky. Vyřešeno. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 24. srpen 2008, 15:15:12    Předmět: Odpovědět s citátem

Matasx napsal:
Díky. Vyřešeno. Smile


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



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

PříspěvekZaslal: 24. srpen 2008, 16:10:07    Předmět: Odpovědět s citátem

Ř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? Embarassed
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: 24. srpen 2008, 19:59:14    Předmět: Odpovědět s citátem

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
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
Strana 1 z 1

 
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