SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 12. srpen 2008, 16:35:33 Předmět: Alpha Blending, Bump-mapping |
|
|
Zdravim, tak zase jdu otravovat
Tentokrat dva dotazy, oboje jsem googlil vskutku dlouho, prepisoval jsem i z c++ - ale vzdy jen to, co jsem tak nejak chapal/tusil co to muze delat.
Zacnu tim alpha blendingem - chtel jsem puvodne jenom point sprity co by mely otaznicek a zbytek byl pruhlednej. Nakonec jsem to predelal na celej ctverec v prostoru aby se mi lip testovalo, ale stejne jsem nedospel k nicemu. Obrazky jsou render, alphatextura, textura:
Zarucene poznate ze to asi neni to co chci - kdyz je alphamapa bila, tak je to cely ruzovy a ty dva otaznicky, kdyz je cerna, tak je to cerny. Proste misto aby to zpruhlednelo, tak to akorat jde k cerne barve.
Rozhodne asi budete chtit videt kod:
kód: |
this.dev.RenderState.AlphaBlendEnable = true;
this.dev.RenderState.ZBufferWriteEnable = false;
this.dev.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
this.dev.RenderState.AlphaDestinationBlend = Blend.InvSourceAlpha;
//stage 0
this.dev.SetTexture(0, sprtex);
this.dev.SetTextureStageState(0, TextureStageStates.ColorOperation, (int)TextureOperation.Modulate);
this.dev.SetTextureStageState(0, TextureStageStates.ColorArgument1, (int)TextureArgument.TextureColor);
this.dev.SetTextureStageState(0, TextureStageStates.ColorArgument2, (int)TextureArgument.Diffuse);
//stage 1
this.dev.SetTexture(1, spralpha);
this.dev.SetTextureStageState(1, TextureStageStates.ColorOperation, (int)TextureOperation.Modulate);
this.dev.SetTextureStageState(1, TextureStageStates.ColorArgument1, (int)TextureArgument.TextureColor);
this.dev.SetTextureStageState(1, TextureStageStates.ColorArgument2, (int)TextureArgument.Current);
//alpha
this.dev.SetTextureStageState(1, TextureStageStates.AlphaOperation, (int)TextureOperation.BlendTextureAlpha);
this.dev.SetTextureStageState(1, TextureStageStates.AlphaArgument1, (int)TextureArgument.TextureColor);
this.dev.SetTextureStageState(1, TextureStageStates.AlphaArgument2, (int)TextureArgument.Current);
|
Pak uz jenom vykresluju primitiva, ve FVF mam Normal, Position, Texture2, by melo byt OK. Ale nejak netusim, co musim udelat, aby to uz bylo sakra pruhledny. Pokud pomuzete, budu opravdu vdecnej
Dalsi co me zajima, tady kod ani hazet nebudu, je bump-mapping. Nasel jsem zase hromadu tutoru, ale z niceho jsem si nezvladnul nic vzit (teda az na jeden, jenze ten nereagoval na pohyb svetla, bylo to porad staticky). Nemate nekdo nejakej tutor (cz,sk,en) kde by bylo dobre popsano co vsechno je potreba "zaridit" aby to "fungovalo"? Tusim jak to nejak funguje (normalovy/height mapy atd), ale uz nevim, jak to dostat do DX. Co do jazyka, je mi to jedno, do C# si prelozim snad vse od Visual Basicu a Delphi po C++ ...
Diky moc za odpovedi
A pokud se me na neco budete nekdo ptat, nenadavejte ze neodpovidam, prijdu sem az v nedeli nebo v pondeli, do te doby jsem pryc. |
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 12. srpen 2008, 19:48:43 Předmět: |
|
|
V tom Tvém kódu vidím několik zádrhelů:
- nenastavuješ způsob výpočtu alphy pro stage 0
- nevypínáš stage 2
- ve stage 0 pracuješ s barvou materiálu nebo vertexu (záleží na nastavení render states) - to je ok?
Já jsem s alphou vždy pracoval tak, že jsem měl texturu s alpha kanálem, takže mi stačila jedna textura a i jedna texturovací stage:
- ColorOperation na SelectArgument1
- ColorArgument1 na TextureColor
- AlphaOperation na SelectArgument1
- AlphaArgument1 na TextureAlpha
- operace pro barvu i alphu pro stage 1 vypnout
Pokud máš dvě textury, přičemž jedna nese info o alphě, tak bych zkusil něco takového:
- stage 0:
- ColorOperation na SelectArgument1
- ColorArgument1 na TextureColor
- AlphaOperation na Current (nebo Disabled?)
- jako texturu nastavit normální texturu
- stage 1:
- ColorOperation na Current
- AlphaOperation na SelectArgument1
- AlphaArgument1 na TextureColor
- jako texturu nastavit normální texturu
- jako texturu nastavit texturu s alpha kanálem
V DX jsem už delší dobu nedělal, ale snad to aspoň trošku pomůže...
Ve čtvrtek odlétám na 12 dní pryč, takže taky nebudu moc reagovat |
|
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 4. září 2008, 20:02:41 Předmět: |
|
|
VYRESENO!!! (reseni na konci, puvodni dotaz tu necham, co kdyby se nekdy hodil)
pisu sem asi uz po ctvrty tak snad to tentokrat odeslu.
vsechno co jsi mi radil jsem zkosuel, googlil jsem, pouzival cizi kod a vsechno mozny, delal jsem blbosti metodou pokus/omyl ale - zadna alpha nebyla ani znat. Ted mam texturu s alpha kanalem (kdyz to hodim do opery, zobrazi se opravdu pruhledna). Ale v programu proste pruhledna neni...
Zkusil jsem dat SourceAlpha na Zero (coz pokud dobre chapu by melo zpusobit ze se vlastne nic nevykresli) - vykresli se vsechno. Ten kod dole (textura t je tenhle obrazek:
(to aby bylo videt ze i tu se zobrazi nejaka pruhlednost).
A jeste kod:
kód: |
#region Point sprite region
this.dev.RenderState.AlphaBlendEnable = true;
this.dev.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
this.dev.RenderState.AlphaDestinationBlend = Blend.InvSourceAlpha;
this.dev.RenderState.PointSpriteEnable = true;
this.dev.RenderState.ZBufferWriteEnable = false;
this.dev.RenderState.PointScaleEnable = true;
this.dev.VertexFormat = VertexSprite.Format;
this.dev.SetStreamSource(0, spritebuffer, 0);
this.dev.SetTexture(0, t);
this.dev.DrawPrimitives(PrimitiveType.PointList, 0, 2);
this.dev.RenderState.AlphaBlendEnable = false;
this.dev.RenderState.PointSpriteEnable = false;
this.dev.RenderState.ZBufferWriteEnable = true;
#endregion |
jestli me nekdo poradite, budu vam vazne vecnej a kdyz prijedete do hradce, vas treba pozvu na pifko. Jenom hlavne at uz to mam z krku. Jinak zkousel jsem i nastavovat A8R8G8B8 forat backbufferu a hodit to i na fullscreen - zadnej rozdil (jak jsem predpokladal). Zkousel jsem texturu nacitat s tim ze to je A8R8G8B8 - zase nic. Nastavoval jsem vertexum alphu 0.5 - zase nic. Vazne uz nevim co s tim... prijdu si jak debil co neumi opsat kus kodu...
(jinak mi v ostatnich vecech alpha chodi naprosto normalne (hry, kompletni binarky odjinud a podobne. Kdyz nakopiruju/opisu podstatny veci (hledam v kodu vetsinou naprosto kazdou blbost) nejede to.).
Reseni:Nauc se cist SUKu, je tam AlphaSourceBlend a DestinationBlend ... ne AlphaDestinationBlend... bleh... |
|