ShadowmapExposer.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. namespace Obi{
  5. public class ShadowmapExposer : MonoBehaviour
  6. {
  7. Light unityLight;
  8. CommandBuffer afterShadow = null;
  9. public ObiParticleRenderer[] particleRenderers;
  10. public void Awake(){
  11. unityLight = GetComponent<Light>();
  12. }
  13. public void OnEnable(){
  14. Cleanup();
  15. afterShadow = new CommandBuffer();
  16. afterShadow.name = "FluidShadows";
  17. unityLight.AddCommandBuffer (LightEvent.AfterShadowMapPass, afterShadow);
  18. }
  19. public void OnDisable(){
  20. Cleanup();
  21. }
  22. private void Cleanup(){
  23. if (afterShadow != null){
  24. unityLight.RemoveCommandBuffer (LightEvent.AfterShadowMapPass,afterShadow);
  25. afterShadow = null;
  26. }
  27. }
  28. public void SetupFluidShadowsCommandBuffer()
  29. {
  30. afterShadow.Clear();
  31. if (particleRenderers == null)
  32. return;
  33. foreach(ObiParticleRenderer renderer in particleRenderers){
  34. if (renderer != null){
  35. foreach(Mesh mesh in renderer.ParticleMeshes)
  36. afterShadow.DrawMesh(mesh,Matrix4x4.identity,renderer.ParticleMaterial,0,1);
  37. }
  38. }
  39. afterShadow.SetGlobalTexture ("_MyShadowMap", new RenderTargetIdentifier(BuiltinRenderTextureType.CurrentActive));
  40. }
  41. // Use this for initialization
  42. void Update()
  43. {
  44. bool act = gameObject.activeInHierarchy && enabled;
  45. if (!act || particleRenderers == null || particleRenderers.Length == 0)
  46. {
  47. Cleanup();
  48. return;
  49. }
  50. if (afterShadow != null)
  51. {
  52. SetupFluidShadowsCommandBuffer();
  53. }
  54. }
  55. }
  56. }