Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
2.1 KiB

  1. ; STATIC: "NORMALMAPALPHAENVMAPMASK" "0..1"
  2. ps.1.1
  3. ;------------------------------------------------------------------------------
  4. ; Environment mapping on a bumped surface
  5. ; t0 - Normalmap
  6. ; t3 - Cube environment map (*must* be a cube map!)
  7. ;
  8. ; c0 - color to multiply the results by
  9. ; c1 - envmap contrast
  10. ; c2 - envmap saturation
  11. ; c3 - grey weights
  12. ; c4 - fresnel amount
  13. ; Input texture coords required here are a little wonky.
  14. ; tc0.uv <- U,V into the normal map
  15. ; tc1.uvw, tc2.uvw, tc3.uvw <- 3x3 matrix transform
  16. ; from tangent space->env map space
  17. ; tc1.q, tc2.q, tc3.q <- eye vector in env map space
  18. ;------------------------------------------------------------------------------
  19. ; Get the 3-vector from the normal map
  20. tex t0
  21. ; Perform matrix multiply to get a local normal bump. Then
  22. ; reflect the eye vector through the normal and sample from
  23. ; a cubic environment map.
  24. texm3x3pad t1, t0_bx2
  25. texm3x3pad t2, t0_bx2
  26. texm3x3vspec t3, t0_bx2
  27. ; FIXME FIXME - Need to do specialized versions of this with and without:
  28. ; - constant color
  29. ; - fresnel amount of exactly 0 or 1 or in between
  30. ; - envmap contrast of 0, 1, or in between
  31. ; - envmap saturation of 0, 1, or in between
  32. ; r0 = constant color * result of bump into envmap
  33. mul r0.rgb, t3, c0
  34. ; dot eye-vector with per-pixel normal from t0
  35. dp3_sat r1, v0_bx2, t0_bx2
  36. ; run Fresnel approx. on it: R0 + (1-R0) (1-cos(q))^5 in alpha channel
  37. mul r1.rgb, r0, r0 ; color squared
  38. +mul r0.a, 1-r1.a, 1-r1.a ; squared
  39. lrp r0.rgb, c1, r1, r0 ; blend between color and color * color
  40. +mul r0.a, r0.a, r0.a ; quartic
  41. dp3 r1.rgb, r0, c3 ; color greyscaled
  42. +mul r0.a, r0.a, 1-r1.a ; quintic
  43. ; FIXME - these should be able to pair (I think), but don't on nvidia for some reason.
  44. ; (I think) cannot pair due to use of >2 constants in single stage
  45. lrp r0.rgb, c2, r0, r1 ; blend between color and greyscale
  46. mad r0.a, r0.a, c6.a, c4.a ; Take Fresnel R(0) into consideration
  47. mul r0.rgb, r0, r0.a ; multiply output color by result of fresnel calc
  48. #if NORMALMAPALPHAENVMAPMASK
  49. +mul r0.a, c0.a, t0.a ; Fade amount * alpha from the texture
  50. #else
  51. +mov r0.a, c0.a ; Just use the fade amount
  52. #endif