4 namespace UnityStandardAssets.ImageEffects
7 [RequireComponent (typeof(Camera))]
8 [AddComponentMenu (
"Image Effects/Rendering/Sun Shafts")]
11 public enum SunShaftsResolution
18 public enum ShaftsScreenBlendMode
25 public SunShaftsResolution resolution = SunShaftsResolution.Normal;
26 public ShaftsScreenBlendMode screenBlendMode = ShaftsScreenBlendMode.Screen;
28 public Transform sunTransform;
29 public int radialBlurIterations = 2;
30 public Color sunColor = Color.white;
31 public Color sunThreshold =
new Color(0.87f,0.74f,0.65f);
32 public float sunShaftBlurRadius = 2.5f;
33 public float sunShaftIntensity = 1.15f;
35 public float maxRadius = 0.75f;
37 public bool useDepthTexture =
true;
39 public Shader sunShaftsShader;
40 private Material sunShaftsMaterial;
42 public Shader simpleClearShader;
43 private Material simpleClearMaterial;
46 public override bool CheckResources () {
47 CheckSupport (useDepthTexture);
49 sunShaftsMaterial = CheckShaderAndCreateMaterial (sunShaftsShader, sunShaftsMaterial);
50 simpleClearMaterial = CheckShaderAndCreateMaterial (simpleClearShader, simpleClearMaterial);
57 void OnRenderImage (RenderTexture source, RenderTexture destination) {
58 if (CheckResources()==
false) {
59 Graphics.Blit (source, destination);
65 GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
68 if (resolution == SunShaftsResolution.Normal)
70 else if (resolution == SunShaftsResolution.High)
73 Vector3 v = Vector3.one * 0.5f;
75 v = GetComponent<Camera>().WorldToViewportPoint (sunTransform.position);
77 v =
new Vector3(0.5f, 0.5f, 0.0f);
79 int rtW = source.width / divider;
80 int rtH = source.height / divider;
82 RenderTexture lrColorB;
83 RenderTexture lrDepthBuffer = RenderTexture.GetTemporary (rtW, rtH, 0);
88 sunShaftsMaterial.SetVector (
"_BlurRadius4",
new Vector4 (1.0f, 1.0f, 0.0f, 0.0f) * sunShaftBlurRadius );
89 sunShaftsMaterial.SetVector (
"_SunPosition",
new Vector4 (v.x, v.y, v.z, maxRadius));
90 sunShaftsMaterial.SetVector (
"_SunThreshold", sunThreshold);
92 if (!useDepthTexture) {
93 var format= GetComponent<Camera>().hdr ? RenderTextureFormat.DefaultHDR: RenderTextureFormat.Default;
94 RenderTexture tmpBuffer = RenderTexture.GetTemporary (source.width, source.height, 0, format);
95 RenderTexture.active = tmpBuffer;
96 GL.ClearWithSkybox (
false, GetComponent<Camera>());
98 sunShaftsMaterial.SetTexture (
"_Skybox", tmpBuffer);
99 Graphics.Blit (source, lrDepthBuffer, sunShaftsMaterial, 3);
100 RenderTexture.ReleaseTemporary (tmpBuffer);
103 Graphics.Blit (source, lrDepthBuffer, sunShaftsMaterial, 2);
107 DrawBorder (lrDepthBuffer, simpleClearMaterial);
111 radialBlurIterations = Mathf.Clamp (radialBlurIterations, 1, 4);
113 float ofs = sunShaftBlurRadius * (1.0f / 768.0f);
115 sunShaftsMaterial.SetVector (
"_BlurRadius4",
new Vector4 (ofs, ofs, 0.0f, 0.0f));
116 sunShaftsMaterial.SetVector (
"_SunPosition",
new Vector4 (v.x, v.y, v.z, maxRadius));
118 for (
int it2 = 0; it2 < radialBlurIterations; it2++ ) {
122 lrColorB = RenderTexture.GetTemporary (rtW, rtH, 0);
123 Graphics.Blit (lrDepthBuffer, lrColorB, sunShaftsMaterial, 1);
124 RenderTexture.ReleaseTemporary (lrDepthBuffer);
125 ofs = sunShaftBlurRadius * (((it2 * 2.0f + 1.0f) * 6.0f)) / 768.0f;
126 sunShaftsMaterial.SetVector (
"_BlurRadius4",
new Vector4 (ofs, ofs, 0.0f, 0.0f) );
128 lrDepthBuffer = RenderTexture.GetTemporary (rtW, rtH, 0);
129 Graphics.Blit (lrColorB, lrDepthBuffer, sunShaftsMaterial, 1);
130 RenderTexture.ReleaseTemporary (lrColorB);
131 ofs = sunShaftBlurRadius * (((it2 * 2.0f + 2.0f) * 6.0f)) / 768.0f;
132 sunShaftsMaterial.SetVector (
"_BlurRadius4",
new Vector4 (ofs, ofs, 0.0f, 0.0f) );
138 sunShaftsMaterial.SetVector (
"_SunColor",
new Vector4 (sunColor.r, sunColor.g, sunColor.b, sunColor.a) * sunShaftIntensity);
140 sunShaftsMaterial.SetVector (
"_SunColor", Vector4.zero);
141 sunShaftsMaterial.SetTexture (
"_ColorBuffer", lrDepthBuffer);
142 Graphics.Blit (source, destination, sunShaftsMaterial, (screenBlendMode == ShaftsScreenBlendMode.Screen) ? 0 : 4);
144 RenderTexture.ReleaseTemporary (lrDepthBuffer);