-exponenciális mélység adatból lineáris mélység visszanyerése near...far tartományban:
F = (V*C+D) / -V;
F = -C + (D / -V)
F + C = D / -V
(F + C) / D = 1 / -V
D / (F + C) = -V
D / (-F - C) = V
D / (F * -2 + 1 - C) = V, mivel az F-t át kell vinni 0..1 tartományból -1..1 tartományba
,ahol C,D a frustum matrix megfelelő elemei, F a végeredmény, V a vertex eye spaceben
glsl:float Z = gl_ProjectionMatrix[3].z/(gl_FragCoord.z * -2.0 + 1.0 - gl_ProjectionMatrix[2].z);
asm:TEX depth, texcoord, texture[X],2D;
MAD tmp, depth, -2.0, ONE_MINUS_D;
RCP tmp, tmp.x;
MUL eye_depth, C, tmp;
-exponenciális mélység adatból lineáris mélység visszanyerése 0..1 tartományban:
glsl:float Z= (2.0 * Near) / (Far + Near - depth * (Far - Near));
asm:MAD depth, depth, NEAR_MINUS_FAR, NEAR_PLUS_FAR;
RCP depth, depth.x;
MUL depth, 2_TIMES_NEAR, depth.x;
-normál visszanyerése 2 komponensből (félgömb ujraleképzés):
csak pozitiv z irány és egységvektor esetén használható!!
glsl:N.z = sqrt( 1 – N.x*N.x – N.y*N.y );
asm:DP2 tmp.z, normal, normal;
SUB tmp.z, 1.0.z, tmp.z;
RSQ tmp.z, tmp.z;
RCP normal.z, tmp.z;
- 2 nem normalizált vektor skalár szorzata:
glsl:float r= dot((N,L) * rsq( dot(N,N) * dot(L,L) )
asm:DP3 tmp0, N,L;
DP3 tmp1, L,L;
DP3 tmp2, N,N;
MUL tmp3, tmp1, tmp2;
RSQ tmp3.x, tmp3.x;
MUL res, tmp0.x, tmp3.x;
-hogyan lesz 2x sebességű a depth (+stencil) only renderelés:
tilos-
-color bufferbe írni
-multisamplet bekapcsolni
-a fragment eldobás (se alpha test, se KIL)
-a fragment mélység módosítás
-használni user defined vágósíkokat
-hogyan lesz early z cull bekapcsolva:
tilos-
-a fragment eldobás (se alpha test, se KIL)
-a fragment mélység módosítás
-gpu feltétel kezelés:
if-then-else
[nv3x] mind2 ág végrehajtódik és a condition code dönti el, melyik számítás kerül a kimeneti regiszterbe
[nv40] valódi feltétel
-gpu feltétel kezelés:
for-loops, do-while
[nv3x] méretkorlát + nincs ciklus változó
[nv40] valódi ciklus