multiPointLightF.glsl
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:2k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file multiPointLightF.glsl
  3.  *
  4.  * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. #extension GL_ARB_texture_rectangle : enable
  8. uniform sampler2DRect depthMap;
  9. uniform sampler2DRect diffuseRect;
  10. uniform sampler2DRect specularRect;
  11. uniform sampler2DRect normalMap;
  12. uniform samplerCube environmentMap;
  13. uniform sampler2D noiseMap;
  14. uniform sampler2D lightFunc;
  15. uniform vec3 env_mat[3];
  16. uniform float sun_wash;
  17. uniform int light_count;
  18. uniform vec4 light[16];
  19. uniform vec4 light_col[16];
  20. varying vec4 vary_fragcoord;
  21. uniform vec2 screen_res;
  22. uniform float far_z;
  23. uniform mat4 inv_proj;
  24. vec4 getPosition(vec2 pos_screen)
  25. {
  26. float depth = texture2DRect(depthMap, pos_screen.xy).a;
  27. vec2 sc = pos_screen.xy*2.0;
  28. sc /= screen_res;
  29. sc -= vec2(1.0,1.0);
  30. vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
  31. vec4 pos = inv_proj * ndc;
  32. pos /= pos.w;
  33. pos.w = 1.0;
  34. return pos;
  35. }
  36. void main() 
  37. {
  38. vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
  39. vec3 pos = getPosition(frag.xy).xyz;
  40. if (pos.z < far_z)
  41. {
  42. discard;
  43. }
  44. vec3 norm = normalize(texture2DRect(normalMap, frag.xy).xyz*2.0-1.0);
  45. vec4 spec = texture2DRect(specularRect, frag.xy);
  46. vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
  47. float noise = texture2D(noiseMap, frag.xy/128.0).b;
  48. vec3 out_col = vec3(0,0,0);
  49. vec3 npos = normalize(-pos);
  50. for (int i = 0; i < light_count; ++i)
  51. {
  52. vec3 lv = light[i].xyz-pos;
  53. float dist2 = dot(lv,lv);
  54. dist2 /= light[i].w;
  55. if (dist2 > 1.0)
  56. {
  57. continue;
  58. }
  59. float da = dot(norm, lv);
  60. if (da < 0.0)
  61. {
  62. continue;
  63. }
  64. lv = normalize(lv);
  65. da = dot(norm, lv);
  66. float fa = light_col[i].a+1.0;
  67. float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
  68. dist_atten *= noise;
  69. float lit = da * dist_atten;
  70. vec3 col = light_col[i].rgb*lit*diff;
  71. //vec3 col = vec3(dist2, light_col[i].a, lit);
  72. if (spec.a > 0.0)
  73. {
  74. //vec3 ref = dot(pos+lv, norm);
  75. float sa = dot(normalize(lv+npos),norm);
  76. if (sa > 0.0)
  77. {
  78. sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
  79. sa *= noise;
  80. col += da*sa*light_col[i].rgb*spec.rgb;
  81. }
  82. }
  83. out_col += col;
  84. }
  85. if (dot(out_col, out_col) <= 0.0)
  86. {
  87. discard;
  88. }
  89. gl_FragColor.rgb = out_col;
  90. gl_FragColor.a = 0.0;
  91. //gl_FragColor = vec4(0.1, 0.025, 0.025/4.0, 0.0);
  92. }