; STATIC: "NORMALMAPALPHAENVMAPMASK" "0..1" #ifndef _XBOX ps.1.1 #else xps.1.1 #endif ;------------------------------------------------------------------------------ ; Environment mapping on a bumped surface ; t0 - Normalmap ; t3 - Cube environment map (*must* be a cube map!) ; ; c0 - color to multiply the results by ; c1 - envmap contrast ; c2 - envmap saturation ; c3 - grey weights ; c4 - fresnel amount ; Input texture coords required here are a little wonky. ; tc0.uv <- U,V into the normal map ; tc1.uvw, tc2.uvw, tc3.uvw <- 3x3 matrix transform ; from tangent space->env map space ; tc1.q, tc2.q, tc3.q <- eye vector in env map space ;------------------------------------------------------------------------------ ; Get the 3-vector from the normal map tex t0 ; Perform matrix multiply to get a local normal bump. Then ; reflect the eye vector through the normal and sample from ; a cubic environment map. texm3x3pad t1, t0_bx2 texm3x3pad t2, t0_bx2 texm3x3vspec t3, t0_bx2 ; FIXME FIXME - Need to do specialized versions of this with and without: ; - constant color ; - fresnel amount of exactly 0 or 1 or in between ; - envmap contrast of 0, 1, or in between ; - envmap saturation of 0, 1, or in between #ifndef _XBOX ; r0 = constant color * result of bump into envmap mul r0.rgb, t3, c0 #endif #ifndef _XBOX ; dot eye-vector with per-pixel normal from t0 dp3_sat r1, v0_bx2, t0_bx2 #endif #ifdef _XBOX xdm r1,r0, v0_bx2, t0_bx2, t3, c0 mov r1, r1_sat #endif ; run Fresnel approx. on it: R0 + (1-R0) (1-cos(q))^5 in alpha channel mul r1.rgb, r0, r0 ; color squared +mul r0.a, 1-r1.a, 1-r1.a ; squared lrp r0.rgb, c1, r1, r0 ; blend between color and color * color +mul r0.a, r0.a, r0.a ; quartic dp3 r1.rgb, r0, c3 ; color greyscaled +mul r0.a, r0.a, 1-r1.a ; quintic ; FIXME - these should be able to pair (I think), but don't on nvidia for some reason. ; (I think) cannot pair due to use of >2 constants in single stage lrp r0.rgb, c2, r0, r1 ; blend between color and greyscale mad r0.a, r0.a, c6.a, c4.a ; Take Fresnel R(0) into consideration mul r0.rgb, r0, r0.a ; multiply output color by result of fresnel calc #ifdef NORMALMAPALPHAENVMAPMASK_1 +mul r0.a, c0.a, t0.a ; Fade amount * alpha from the texture #else +mov r0.a, c0.a ; Just use the fade amount #endif