.[ ČeskéHry.cz ].
Stíny
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
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2010, 18:15:03    Předmět: Stíny Odpovědět s citátem

Může se mi někdo podívat na fragment kódu, který používám na generování stínové mapy....
Muj stin totiz vypada neuveritelne "hnusne" (http://www.perry.cz/files/why.png)

Používám 1 texturu formátu R32F, do které narenderuji sachovnicove 4 stínové mapy.

V shaderu potom provedu prepocet shiftem UV souradnie do spravne casti... shader zda se funguje, ale generovani mapy ma nejaky problemy
1) Proc je prvni kaskáda světlejší než další ?
2) proč už druhá je tak hrozně pixolvaná
3) na upatich kopce vz. "osvětlené" triangly, a vubec cele se to jakoby "vlni" pri pohybu... a vypada to nepekne

kody:
Shader: http://www.perry.cz/files/multi.fx
Fragment DX kodu na stin: http://www.perry.cz/files/shadow.txt (tady si myslim, ze je nekde neco blbe... ale uz se v tom patlam asi mesic porad to vypada nic moc)

Jestli mi nekdo dokaze poradit, budu nevyslovne stastny Smile Zatim mi totiz nikdo nic neporadil.. akorat obecne postupy, jak to udelat... ktere cca. znam..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 28. únor 2010, 13:09:25    Předmět: Odpovědět s citátem

Tak jsem trochu poupravil "skladbu". Používám 1 texturu A16R16G16B16F, do které narenderuji do každého kanálu 1 stínovou mapu.

Nicméně problémy přetrvávají. Momentálně mam divně posunutý stín... v červených kroužcích... to, co je zelená tečka by mělo být na místě, kam ukazuje ta zelená šipka Smile

Zkoušel jsem měnit texturovací matici, nic... ořezávací matici scény jsem neměnil... a když jsem renderoval přes depth stencil, tak to fungovalo

http://www.perry.cz/files/shadow.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



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

PříspěvekZaslal: 28. únor 2010, 16:16:53    Předmět: Odpovědět s citátem

Ahoj, já shadow mapping dělám tak, že mám v R kanálu určenou vzdálenost od světla a v G kanálu sytost stínu. Jestli chceš, mohu ti dát k dispozici moje shadery... Tvůj jsem nečetl, nicméně není chyba v tom, že nepočítáš s výškou terénu při renderování mapy? Vypadá to totiž na chybu podobného ražení....

Můj shadow mapping:
http://www.mickyprog.wz.cz/img/tower/24.jpg

Každopádně přeju hodně zdaru s vyřešením problému. Wink
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 28. únor 2010, 16:58:16    Předmět: Odpovědět s citátem

Ten barák stojí na rovině :/

("Zaspomavl" jsem s tim problémem několik fór a nikdo mi nic neporadil... buď neví, nebo už je štvu.. protože to je asi 4 topic ohledně stínů.. jak vždycky zkusim něco jinýho na lepší výsledek, tak se někde seknu Very Happy)

Jinak jsem postupně iteroval 1 stínová mapa R32F -> 3 mapy přes depth stenicl (ovšem to neporporovaly některé karty) -> 3 mapy zabalené šachovnicově v 1 textuře -> a ted mam A16R16G16B16F ... tzn v každém kanálu mám jakoby R16F texturu... sice nižší přesnost, ale při stejném výkonu vyšší kvalita (není to můj nápad.. inspiroval jsem se v TrueVision3D enginu)

Nicméně, ten bug (1. už ani ne... spíš ten co jsem postoval naposled) mi dost štve
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



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

PříspěvekZaslal: 28. únor 2010, 18:03:44    Předmět: Odpovědět s citátem

Mas tam bias? Skus sa s nim trochu pohrat. Tiez to moze byt zlym nastavenim near a far.
Nepaci sa mi tam funkcia GetSplitByDistance(), do 4D-float rves 1D-float (v skutocnosti len true alebo false) a este s tym robis kvadrat magnitudy, neviem presne k comu to je. A tiez neviem, co je xSplitPlanes. Kazdopadne to je jedine miesto, kde je instrukcia compare na porovnanie hodnoty z tienovej mapy (distance), takze by som skusil hladat chybu niekde okolo toho. A este bias a spravne nastavenie transformacii - odbornik na HLSL nie som...
Dufam, ze sa ozvu experti na shadery Smile

EDIT: Nasiel som shadery, co sme kodili v skole (v NV FX Composeri sme dostali hotovu scenu, nepisali sme si k tomu vlastnu C++ logiku), tak snad z toho nieco vycitas:
http://nopaste.ceske-hry.cz/222915 - bez PCF (len utlm od stredu kuzela - svietili sme na to reflektorom)
http://nopaste.ceske-hry.cz/222914 - S PCF
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.


Naposledy upravil pcmaster dne 28. únor 2010, 18:11:52, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 28. únor 2010, 18:11:18    Předmět: Odpovědět s citátem

Bias jsem zkoušel... možná blbě.. kam konkrétně bych ho podle tebe měl nacpat ? Dávam ho do texturovací matice na pozici [4,3]

Jinak GetSplitByDistance() funguje... Smile Je to ze zdrojáku jednoho enginu.. udělá to to, že to uloží v tom floatu podle porovnání na určitou pozici 1 a dot potom vrátí tu pozici....

xSplitPlanes jsou jednotlive vzdalenosti ke konci kaskady

EDIT:
Hm.. zjistil jsem další divnou věc... když mam shadow mapu do 1024 x 1024, tak je to ok... ale třeba mapa 2048x2048 už se vykresli komplet černá Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 1. březen 2010, 01:08:22    Předmět: Odpovědět s citátem

Protože 1024x1024 texturu ještě vyrenderuješ v klasickém backbufferu na obrazovce, ale 2048x2048 textura se ti tam nevleze.

Pokud chceš renderovat dynamické textury větší než tvůj backbuffer, potom nejlepšími možnostmi jsou buď PBuffery (Pixel Buffery), nebo lépe FBO (Frame buffer objects).

Zobrazuješ pouze 2 mapy z kaskády (nebo alespoň tak to vypadá na screenu co jsi poslal) - shader jsem nečetl, ale chyba je určitě v přidělování kaskády a následnému zapisování barvy (ale prvně si zajisti ať máš správně kaskády - tedy všechny 4 mapy).
Případně je možné, že šachovnici špatně renderuješ ... ale to myslím že ne.

Já s shadow mappingem každopádně problémy nemám ... s trochou upravování (pár triky a hodně velkou spoustou matematiky) dokáže generovat opravdu skvělé stíny:

_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.


Naposledy upravil Vilem Otte dne 1. březen 2010, 11:39:34, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 1. březen 2010, 08:22:31    Předmět: Odpovědět s citátem

citace:

Protože 1024x1024 texturu ještě vyrenderuješ v klasickém backbufferu na obrazovce, ale 2048x2048 textura se ti tam nevleze.


Ahh.. díky.. to bylo ono...

citace:

Případně je možné, že šachovnici špatně renderuješ ... ale to myslím že ne.


Šachovnici jsem zrušil.. teď renderuju do jednotlivých kanálů ARGB

citace:

Zobrazuješ pouze 2 mapy z kaskády (nebo alespoň tak to vypadá na screenu co jsi poslal) - shader jsem nečetl, ale chyba je určitě v přidělování kaskády a následnému zapisování barvy


Na 99% přiděluju kaskády správně (barevně jsem si je odlišil a asedělo to). To že zobrazju pouze 2 mapy je daný tím, že ta 3. je už moc daleko a 4. nepoužívám (ta je zatím volná), protože pak FPS letělo ještě o jeden render níž.

Nicméně nejvíc mě trápí ten "domeček"... Někde je blbě nějaký offset ale nemůžu ho najít. Nejvíc mě zaráží, že přes ten depthStencilSurface to všechno fungovalo (nicméně to zase celý blblo na starších kartách a no-nvidia kartách, protože neuměli zapsat stencil do textur)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 3. březen 2010, 17:57:40    Předmět: Odpovědět s citátem

Po několika hodinovém bádání jsem našel chybu...

..
To co je pod černou čarou se do stínové mapy NEMÁ renderovat, protože to leží pod terénem.... nicméně se to tam vrenderuje a nevim opravdu proč.


Hlavní kód
http://www.perry.cz/files/code.png

kód:

depthStencil = new Texture(device, shadowMapSize, shadowMapSize, 1, Usage.DepthStencil, Format.D16, Pool.Default);

dummy = Surface.CreateRenderTarget(device, shadowMapSize, shadowMapSize, Format.A8R8G8B8, MultisampleType.None, 0, false);



ShawoMapPS:
kód:

struct ShadowMapVertexToPixel
{
   float4 Position    :   POSITION;
   float4 PixelOut      :   TEXCOORD0;
};

//tvorba shadow mapy - vertex shader
ShadowMapVertexToPixel ShadowMapVS(float4 inPos : POSITION )
{
   ShadowMapVertexToPixel Output = (ShadowMapVertexToPixel)0;   
   Output.Position = CalcPositionInWorld(inPos);
   Output.PixelOut = Output.Position;
   
   return Output;
}

//tvorba shadow mapy - pixel shader
float4 ShadowMapPS(ShadowMapVertexToPixel PSIn) : COLOR
{   
   return float4(0, 0, 0, 1);
}

technique ShadowMap
{
   pass Pass0
   {
      CullMode = CW;
      VertexShader = compile vs_2_0 ShadowMapVS();
      PixelShader = compile ps_2_0 ShadowMapPS();
   }
}


Někde tady musí být něco blbě.. ale nevidím co, ať dělám co dělám
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



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

PříspěvekZaslal: 3. březen 2010, 21:09:48    Předmět: Odpovědět s citátem

Ahoj,
nevím, jak fungují ořezávací testy ve chvíli, kdy bys na render do shadow mapy použil shadery...

Při promítání stínu musíš porovnat vzdálenost uloženou v shadow mapě se vzdáleností kresleného pixelu terénu (samozřejmě vzdálenost od světla) ... podle toho se buďto vykreslí stín, nebo ne.

Přiznám se, že kód jsem nečetl nikterak pozorně, ale tuším chybu právě v tom porovnávání.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
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: 3. březen 2010, 21:24:14    Předmět: Odpovědět s citátem

A renderuješ do stínové mapy také ten terén? Měl bys...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 3. březen 2010, 21:53:12    Předmět: Odpovědět s citátem

citace:
A renderuješ do stínové mapy také ten terén? Měl bys...


Nejdřív do shadow mapy renderuji terén, pak objekty...

Problém je vidět na tom obrázku... terén je na úrovni černé čáry a to pod je pod terénem, ale do shadow mapy se vrenderuje to modrý...

Takže porovnání už je pak vedlejší, když je shadow mapa narenderovaná blbě... nebo mi přijde, že by tam jaksi být to, co je pod terénem, být nemělo. A v renderingu se mi tam pak namapuje celá textura... u toho domečku by to tak nevadilo, ovšem ono je díky tomu vidět i stín "z druhý strany kopce" na straně přilehlé ke světlu.

kód:

VS:
lightDepth = mul(float4(inPos.xyz, 1), xViewProjection).z;

PS:
float lightingFactor = lightDepth > tex2D(ShadowMapSampler, texShadowCoord)[index];
return 1.0f - lightingFactor * 0.7f;


Zkusil jsem to upravit takhle... ale pořád stejný výsledek... (kód jsem vytáhnul z fungujího shadow mappingu)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 3. březen 2010, 22:27:00    Předmět: Odpovědět s citátem

Při renderingu do stínové mapy se používá klasický Z-test, takže pořadí renderingu by nemělo mít vliv na výsledek.

Jak jsi ukazoval ten obrázek, tak to modré se Ti vyrenderuje do stínové mapy? Takže máš obrácený culling, tj. ořezáváš přivrácené plochy? Jen se ptám, taky to tak dělám Smile
Tak jak s tou modrou? A co Z-test a Z-write? Oboje zapnuté?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



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

PříspěvekZaslal: 3. březen 2010, 22:36:12    Předmět: Odpovědět s citátem

Vahal som, ci mu to napisem, ale nechcel som dopadnut ako pri tom prvom pokuse, ze som trafil vedla Very Happy Augiho dotazy su ale spravne, no mozno tiez vedla, kedze to tak tipujem aj ja Embarassed
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 3. březen 2010, 22:39:01    Předmět: Odpovědět s citátem

Culling mam na CW..

Z-Test i Z-Write by měl bt zapnutý... resp. předpokládám kdyby nebyl, tak by se renderovalo vše ostatní špatně taky.

Na tom obrázku se mi tam vrederuje do stínové mapy ta modrá.

Dřív jsem to měl napsaný přes depth stencil texture a fungovalo to. Jenomže to mělo problémy na některých kartách. Tak jsem to přepsal na 4 kanálovou float texturu (každá mapa v jednom kanálu)... problémy zmizeli, ale přibylo tohle... nicméně jsem se to snažil teda přehodit zpátky na původní řešení.. mám téměř 1:1 kódy (provedl jsem nějaké změny v shaderu... ale spíše kosmetické, jako změna pole 4 floatu na float4, jiný způsob výběru indexu) , ale nefunguje to

Problém je, že u depth stencilu jsem nemohl vizualizovat, co se do něj rendrovalo, takže nevím jestli to před tím nebylo taky a jestli to pak "nezmizelo" při projekci stínu při finálním renderu...

Fragmenty hlavních částí shaderu (zbytek se stara o texturing a projekce, ten je 100% OK)

Momentálně mam finální render ve VS:
kód:

...
Output.TextureDepthDiffuse.z = mul(float4(inPos.xyz, 1), xViewProjection).z;
float4 lightSpace;
      for (int i = 0; i < 3; i++){
         Output.TexShadowCoords[i] = mul(posInWorld, xTextureMat[i]);
         lightSpace = mul(posInWorld, xLightMat[i]);
         Output.Lighting[i] = lightSpace.z / lightSpace.w - 0.0126f;   
      }


A v PS
kód:


half GetSplitByDistance(float distance)
{   
   float4 fTest = distance > xSplitPlanes;
   return dot(fTest, fTest);   
}

float GetShadow(half index, float2 texShadowCoord, float lightDepth)
{
   
   float lightingFactor = lightDepth > tex2D(ShadowMapSampler, texShadowCoord)[index]; //index urci kanal r/g/b/a
   return 1.0f - lightingFactor * 0.7f;
}

PS(){
float distance = PSIn.TextureDepthDiffuse.z;
half index = GetSplitByDistance(distance);   
return lightingFactor = GetShadow(index, PSIn.TexShadowCoords[index], PSIn.Lighting[index]);   
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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