common.sh 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. * Copyright 2013-2014 Dario Manesku. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
  4. */
  5. #include "../common/common.sh"
  6. float linstep(float _edge0, float _edge1, float _x)
  7. {
  8. return clamp((_x-_edge0)/(_edge1-_edge0), 0.0, 1.0);
  9. }
  10. float attenuation(float _dist, vec3 _attn)
  11. {
  12. return 1.0 / ( _attn.x //const
  13. + _attn.y * _dist //linear
  14. + _attn.z * _dist * _dist //quadrantic
  15. );
  16. }
  17. float spot(float _ldotsd, float _inner, float _outer)
  18. {
  19. float inner = cos(radians(_inner));
  20. float outer = cos(radians(min(_outer, _inner - 0.001)));
  21. float spot = clamp((_ldotsd - inner) / (outer - inner), 0.0, 1.0);
  22. return spot;
  23. }
  24. vec2 lit(vec3 _ld, vec3 _n, vec3 _vd, float _exp)
  25. {
  26. //diff
  27. float ndotl = dot(_n, _ld);
  28. //spec
  29. vec3 r = 2.0*ndotl*_n - _ld; // reflect(_ld, _n);
  30. float rdotv = dot(r, _vd);
  31. float spec = step(0.0, ndotl) * pow(max(0.0, rdotv), _exp) * (2.0 + _exp)/8.0;
  32. return max(vec2(ndotl, spec), 0.0);
  33. }
  34. struct Light
  35. {
  36. vec3 l;
  37. vec3 ld;
  38. float attn;
  39. };
  40. Light evalLight(vec3 _v, vec4 _l, vec3 _spotDirection, float _spotInner, float _spotOuter, vec3 _attnParams)
  41. {
  42. Light light;
  43. //directional
  44. light.l = _l.xyz;
  45. light.ld = -normalize(light.l);
  46. light.attn = 1.0;
  47. if (0.0 != _l.w) //point or spot
  48. {
  49. light.l = _l.xyz - _v;
  50. light.ld = normalize(light.l);
  51. float ldotsd = max(0.0, dot(-light.ld, normalize(_spotDirection)));
  52. float falloff = spot(ldotsd, _spotOuter, _spotInner);
  53. light.attn = attenuation(length(light.l), _attnParams) * mix(falloff, 1.0, step(90, _spotOuter));
  54. }
  55. return light;
  56. }
  57. float texcoordInRange(vec2 _texcoord)
  58. {
  59. bool inRange = all(greaterThan(_texcoord, vec2_splat(0.0)))
  60. && all(lessThan (_texcoord, vec2_splat(1.0)))
  61. ;
  62. return float(inRange);
  63. }
  64. float hardShadow(sampler2D _sampler, vec4 _shadowCoord, float _bias)
  65. {
  66. vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
  67. bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
  68. || any(lessThan (texCoord, vec2_splat(0.0)))
  69. ;
  70. if (outside)
  71. {
  72. return 1.0;
  73. }
  74. float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w;
  75. float occluder = unpackRgbaToFloat(texture2D(_sampler, texCoord) );
  76. float visibility = step(receiver, occluder);
  77. return visibility;
  78. }
  79. float PCF(sampler2D _sampler, vec4 _shadowCoord, float _bias, vec4 _pcfParams, vec2 _texelSize)
  80. {
  81. float result = 0.0;
  82. vec2 offset = _pcfParams.zw * _texelSize * _shadowCoord.w;
  83. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -1.5) * offset, 0.0, 0.0), _bias);
  84. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, -0.5) * offset, 0.0, 0.0), _bias);
  85. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 0.5) * offset, 0.0, 0.0), _bias);
  86. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-1.5, 1.5) * offset, 0.0, 0.0), _bias);
  87. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -1.5) * offset, 0.0, 0.0), _bias);
  88. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, -0.5) * offset, 0.0, 0.0), _bias);
  89. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 0.5) * offset, 0.0, 0.0), _bias);
  90. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(-0.5, 1.5) * offset, 0.0, 0.0), _bias);
  91. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -1.5) * offset, 0.0, 0.0), _bias);
  92. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, -0.5) * offset, 0.0, 0.0), _bias);
  93. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 0.5) * offset, 0.0, 0.0), _bias);
  94. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(0.5, 1.5) * offset, 0.0, 0.0), _bias);
  95. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -1.5) * offset, 0.0, 0.0), _bias);
  96. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, -0.5) * offset, 0.0, 0.0), _bias);
  97. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 0.5) * offset, 0.0, 0.0), _bias);
  98. result += hardShadow(_sampler, _shadowCoord + vec4(vec2(1.5, 1.5) * offset, 0.0, 0.0), _bias);
  99. return result / 16.0;
  100. }
  101. float VSM(sampler2D _sampler, vec4 _shadowCoord, float _bias, float _depthMultiplier, float _minVariance)
  102. {
  103. vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
  104. bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
  105. || any(lessThan (texCoord, vec2_splat(0.0)))
  106. ;
  107. if (outside)
  108. {
  109. return 1.0;
  110. }
  111. float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w * _depthMultiplier;
  112. vec4 rgba = texture2D(_sampler, texCoord);
  113. vec2 occluder = vec2(unpackHalfFloat(rgba.rg), unpackHalfFloat(rgba.ba)) * _depthMultiplier;
  114. if (receiver < occluder.x)
  115. {
  116. return 1.0;
  117. }
  118. float variance = max(occluder.y - (occluder.x*occluder.x), _minVariance);
  119. float d = receiver - occluder.x;
  120. float visibility = variance / (variance + d*d);
  121. return visibility;
  122. }
  123. float ESM(sampler2D _sampler, vec4 _shadowCoord, float _bias, float _depthMultiplier)
  124. {
  125. vec2 texCoord = _shadowCoord.xy/_shadowCoord.w;
  126. bool outside = any(greaterThan(texCoord, vec2_splat(1.0)))
  127. || any(lessThan (texCoord, vec2_splat(0.0)))
  128. ;
  129. if (outside)
  130. {
  131. return 1.0;
  132. }
  133. float receiver = (_shadowCoord.z-_bias)/_shadowCoord.w;
  134. float occluder = unpackRgbaToFloat(texture2D(_sampler, texCoord) );
  135. float visibility = clamp(exp(_depthMultiplier * (occluder-receiver) ), 0.0, 1.0);
  136. return visibility;
  137. }
  138. vec4 blur9(sampler2D _sampler, vec2 _uv0, vec4 _uv1, vec4 _uv2, vec4 _uv3, vec4 _uv4)
  139. {
  140. #define _BLUR9_WEIGHT_0 1.0
  141. #define _BLUR9_WEIGHT_1 0.9
  142. #define _BLUR9_WEIGHT_2 0.55
  143. #define _BLUR9_WEIGHT_3 0.18
  144. #define _BLUR9_WEIGHT_4 0.1
  145. #define _BLUR9_NORMALIZE (_BLUR9_WEIGHT_0+2.0*(_BLUR9_WEIGHT_1+_BLUR9_WEIGHT_2+_BLUR9_WEIGHT_3+_BLUR9_WEIGHT_4) )
  146. #define BLUR9_WEIGHT(_x) (_BLUR9_WEIGHT_##_x/_BLUR9_NORMALIZE)
  147. float blur;
  148. blur = unpackRgbaToFloat(texture2D(_sampler, _uv0) * BLUR9_WEIGHT(0));
  149. blur += unpackRgbaToFloat(texture2D(_sampler, _uv1.xy) * BLUR9_WEIGHT(1));
  150. blur += unpackRgbaToFloat(texture2D(_sampler, _uv1.zw) * BLUR9_WEIGHT(1));
  151. blur += unpackRgbaToFloat(texture2D(_sampler, _uv2.xy) * BLUR9_WEIGHT(2));
  152. blur += unpackRgbaToFloat(texture2D(_sampler, _uv2.zw) * BLUR9_WEIGHT(2));
  153. blur += unpackRgbaToFloat(texture2D(_sampler, _uv3.xy) * BLUR9_WEIGHT(3));
  154. blur += unpackRgbaToFloat(texture2D(_sampler, _uv3.zw) * BLUR9_WEIGHT(3));
  155. blur += unpackRgbaToFloat(texture2D(_sampler, _uv4.xy) * BLUR9_WEIGHT(4));
  156. blur += unpackRgbaToFloat(texture2D(_sampler, _uv4.zw) * BLUR9_WEIGHT(4));
  157. return packFloatToRgba(blur);
  158. }
  159. vec4 blur9VSM(sampler2D _sampler, vec2 _uv0, vec4 _uv1, vec4 _uv2, vec4 _uv3, vec4 _uv4)
  160. {
  161. #define _BLUR9_WEIGHT_0 1.0
  162. #define _BLUR9_WEIGHT_1 0.9
  163. #define _BLUR9_WEIGHT_2 0.55
  164. #define _BLUR9_WEIGHT_3 0.18
  165. #define _BLUR9_WEIGHT_4 0.1
  166. #define _BLUR9_NORMALIZE (_BLUR9_WEIGHT_0+2.0*(_BLUR9_WEIGHT_1+_BLUR9_WEIGHT_2+_BLUR9_WEIGHT_3+_BLUR9_WEIGHT_4) )
  167. #define BLUR9_WEIGHT(_x) (_BLUR9_WEIGHT_##_x/_BLUR9_NORMALIZE)
  168. vec2 blur;
  169. vec4 val;
  170. val = texture2D(_sampler, _uv0) * BLUR9_WEIGHT(0);
  171. blur = vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  172. val = texture2D(_sampler, _uv1.xy) * BLUR9_WEIGHT(1);
  173. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  174. val = texture2D(_sampler, _uv1.zw) * BLUR9_WEIGHT(1);
  175. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  176. val = texture2D(_sampler, _uv2.xy) * BLUR9_WEIGHT(2);
  177. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  178. val = texture2D(_sampler, _uv2.zw) * BLUR9_WEIGHT(2);
  179. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  180. val = texture2D(_sampler, _uv3.xy) * BLUR9_WEIGHT(3);
  181. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  182. val = texture2D(_sampler, _uv3.zw) * BLUR9_WEIGHT(3);
  183. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  184. val = texture2D(_sampler, _uv4.xy) * BLUR9_WEIGHT(4);
  185. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  186. val = texture2D(_sampler, _uv4.zw) * BLUR9_WEIGHT(4);
  187. blur += vec2(unpackHalfFloat(val.rg), unpackHalfFloat(val.ba));
  188. return vec4(packHalfFloat(blur.x), packHalfFloat(blur.y));
  189. }