light.sha 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. //Cg
  2. //
  3. //Cg profile arbvp1 arbfp1
  4. void vshader(float4 vtx_position : POSITION,
  5. out float4 l_position : POSITION,
  6. out float4 l_pos : TEXCOORD0,
  7. uniform float4x4 mat_modelproj,
  8. uniform float4x4 trans_model_to_clip)
  9. {
  10. l_position=mul(mat_modelproj, vtx_position);
  11. l_pos=mul(trans_model_to_clip, vtx_position);
  12. l_pos.z = l_pos.w;
  13. }
  14. void fshader(float4 l_pos: TEXCOORD0,
  15. uniform sampler2D k_texnormal : TEXUNIT0,
  16. uniform sampler2D k_texalbedo : TEXUNIT1,
  17. uniform sampler2D k_texdepth : TEXUNIT2,
  18. uniform float4 texpad_texnormal,
  19. uniform float4 k_proj,
  20. uniform float4 vspos_model,
  21. uniform float4 k_lightcolor,
  22. uniform float4 row0_model_to_view,
  23. out float4 o_color: COLOR)
  24. {
  25. float3 screen = l_pos.xyz / l_pos.w;
  26. float2 texcoords = float2(screen.xy) * texpad_texnormal.xy + texpad_texnormal.xy;
  27. float4 albedo = tex2D(k_texalbedo, texcoords);
  28. float4 normal = tex2D(k_texnormal, texcoords);
  29. float depth = tex2D(k_texdepth, texcoords);
  30. float3 view = (screen.xzy * k_proj.xyz) / (depth + k_proj.w);
  31. float3 lightvec = float3(vspos_model) - view;
  32. float lightdist = length(lightvec);
  33. float3 lightdir = lightvec / lightdist;
  34. float scaledist = (lightdist / row0_model_to_view.x);
  35. float falloff = saturate(1.0 - scaledist);
  36. float brite = falloff * falloff * dot(lightdir, float3(normal));
  37. o_color = albedo * k_lightcolor * brite;
  38. o_color.a = 1;
  39. }