/src/aerys/minko/render/effect/lightScattering/LightScatteringPostProcessShader.as

https://bitbucket.org/HopeSky/mars_nd2d · ActionScript · 107 lines · 89 code · 17 blank · 1 comment · 1 complexity · d599b15f7441bdad9b1b7a3cd0fed9f7 MD5 · raw file

  1. package aerys.minko.render.effect.lightScattering
  2. {
  3. import aerys.minko.render.resource.texture.TextureResource;
  4. import aerys.minko.render.shader.SFloat;
  5. import aerys.minko.render.shader.Shader;
  6. import aerys.minko.render.shader.ShaderSettings;
  7. import aerys.minko.render.shader.part.PostProcessingShaderPart;
  8. import aerys.minko.scene.data.lightScattering.LightScatteringProvider;
  9. import aerys.minko.type.enum.Blending;
  10. import aerys.minko.type.enum.DepthTest;
  11. import aerys.minko.type.enum.SamplerFiltering;
  12. import aerys.minko.type.enum.SamplerMipMapping;
  13. import aerys.minko.type.enum.SamplerWrapping;
  14. import aerys.minko.type.enum.TriangleCulling;
  15. import aerys.minko.type.math.Vector4;
  16. import flash.utils.Dictionary;
  17. public class LightScatteringPostProcessShader extends Shader
  18. {
  19. private var _postProcessing : PostProcessingShaderPart = null;
  20. private var _numSamples : Number = 0.;
  21. private var _nbPasses : Number = 0.;
  22. private var _curPass : Number = 0.;
  23. private var _occludedSource : TextureResource = null;
  24. public function LightScatteringPostProcessShader(numSamples : Number,
  25. nbPasses : Number,
  26. curPass : Number,
  27. occlusionMap : TextureResource)
  28. {
  29. _nbPasses = nbPasses;
  30. _curPass = curPass;
  31. _numSamples = numSamples;
  32. _occludedSource = occlusionMap;
  33. _postProcessing = new PostProcessingShaderPart(this);
  34. }
  35. override protected function initializeSettings(settings:ShaderSettings):void
  36. {
  37. super.initializeSettings(settings);
  38. settings.depthTest = DepthTest.ALWAYS;
  39. settings.blending = Blending.ADDITIVE;
  40. settings.triangleCulling = TriangleCulling.NONE;
  41. }
  42. override protected function getVertexPosition() : SFloat
  43. {
  44. return _postProcessing.vertexPosition;
  45. }
  46. private function localToUV(value : SFloat) : SFloat
  47. {
  48. return divide(add(localToScreen(value), 1), 2);
  49. }
  50. override protected function getPixelColor() : SFloat
  51. {
  52. var lightPosition : SFloat = sceneBindings.getParameter(LightScatteringProperties.SOURCE_POSITION, 4);
  53. var lighDirection : SFloat = normalize(subtract(lightPosition, cameraPosition));
  54. var textureVertexPos : SFloat = saturate(interpolate(vertexUV));
  55. var textureLightPos : SFloat = localToUV(lightPosition);
  56. var vertexToLightDelta : SFloat = subtract(divide(textureLightPos.xy, textureLightPos.w), textureVertexPos);
  57. var cameraDirection : SFloat = normalize(this.cameraDirection);
  58. var dotProductResult : SFloat = dotProduct3(lighDirection, normalize(cameraDirection));
  59. var colorMultiplier : SFloat = subtract(dotProductResult, 0.5);
  60. var occlusionMap : SFloat = getTexture(
  61. _occludedSource,
  62. SamplerFiltering.LINEAR,
  63. SamplerMipMapping.LINEAR,
  64. SamplerWrapping.CLAMP
  65. );
  66. var initialColor : SFloat = sampleTexture(occlusionMap, textureVertexPos);
  67. var illumDecay : SFloat = float(1.);
  68. var sampleColor : SFloat = null;
  69. // light scattering source values
  70. var sourceCensity : SFloat = sceneBindings.getParameter(LightScatteringProperties.SOURCE_DENSITY, 1);
  71. var sourceWeight : SFloat = sceneBindings.getParameter(LightScatteringProperties.SOURCE_WEIGHT, 1);
  72. var sourceDecay : SFloat = sceneBindings.getParameter(LightScatteringProperties.SOURCE_DECAY, 1);
  73. var sourceExposure : SFloat = sceneBindings.getParameter(LightScatteringProperties.SOURCE_EXPOSURE, 1);
  74. vertexToLightDelta = multiply(vertexToLightDelta, divide(sourceCensity, _numSamples));
  75. textureVertexPos = add(textureVertexPos, multiply(divide(vertexToLightDelta, _nbPasses), _curPass));
  76. for (var i : int = 0; i < _numSamples; ++i)
  77. {
  78. textureVertexPos = add(textureVertexPos, vertexToLightDelta);
  79. sampleColor = sampleTexture(occlusionMap, textureVertexPos);
  80. sampleColor = multiply(sampleColor, sourceWeight, illumDecay);
  81. initialColor = add(initialColor, sampleColor);
  82. illumDecay.scaleBy(sourceDecay);
  83. }
  84. return float4(
  85. multiply(initialColor.rgb, sourceExposure, colorMultiplier),
  86. 1.
  87. );
  88. }
  89. }
  90. }