Gondolkoztam kicsit, és mivel úgy voltam vele, hogy úgyis kelleni fog a lineáris depth a CSM miatt, keresgéltem kicsit a neten. Sokkal kényelmesebb lineáris (view space) depthet eltárolni, még visszaszámolni is olcsóbb.
Kell egy sugár a kamera pozíciójából a vertex pozíciójába (ez worldspace), ezt normalizáljuk a pixel shaderben, szorozzuk a kivett depth értékkel és hozzáadjuk a kamera pozícióját. Tehát valami ilyesmi:
//vertex shader
void main(
in out float4 Position : POSITION0,
out float4 ScreenPos : TEXCOORD0,
out float3 EyeRay : TEXCOORD1)
{
float4 wpos = mul(Position, world);
Position = mul(wpos, viewProj);
ScreenPos = Position;
EyeRay = wpos.xyz - eyePosition;
}
//pixel shader
float depthText = tex2D(samplerDepth, Texcoord);
EyeRay = normalize(EyeRay);
float3 wposition = eyePosition + EyeRay * depthText;
Emellett a lineáris depth pontosabb távolabbi objektumokra is, így például egy diablo2-nézetes játéknál érthető, hogy sokkal pontosabb eredményt ad egy lineáris depth, mint egy exponenciális (ami a position.z / position.w-ből jön)
Emellett elkezdtem szórakozni a CSM-el is, max. 4 splitünk lehet, és egyetlen textúrába gyűjtöm bele a külön textúrákat. Tehát ha van egy 512x512-es split méretű shadow mapem, akkor lesz egy 1024x1024-es rendertargetem, amibe a 4 split textúráját belerakom, így csak ezt kell átadni az árnyékolást végző shadernek, ami a távolságból meghatározza, hogy melyik splitbe tartozik az adott pixel.
Képek akkor lesznek, ha már jó lesz, és működni is fog rendesen :D
Ajánlott bejegyzések:
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.