4 namespace UnityStandardAssets.ImageEffects
7 [RequireComponent (typeof(Camera))]
8 [AddComponentMenu(
"Image Effects/Rendering/Screen Space Ambient Occlusion")]
11 public enum SSAOSamples
19 public float m_Radius = 0.4f;
20 public SSAOSamples m_SampleCount = SSAOSamples.Medium;
22 public float m_OcclusionIntensity = 1.5f;
24 public int m_Blur = 2;
26 public int m_Downsampling = 2;
28 public float m_OcclusionAttenuation = 1.0f;
29 [Range(0.00001f, 0.5f)]
30 public float m_MinZ = 0.01f;
32 public Shader m_SSAOShader;
33 private Material m_SSAOMaterial;
35 public Texture2D m_RandomTexture;
37 private bool m_Supported;
39 private static Material CreateMaterial (Shader shader)
43 Material m =
new Material (shader);
44 m.hideFlags = HideFlags.HideAndDontSave;
47 private static void DestroyMaterial (Material mat)
51 DestroyImmediate (mat);
59 DestroyMaterial (m_SSAOMaterial);
64 if (!SystemInfo.supportsImageEffects || !SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth))
72 if (!m_SSAOMaterial || m_SSAOMaterial.passCount != 5)
85 GetComponent<Camera>().depthTextureMode |= DepthTextureMode.DepthNormals;
88 private void CreateMaterials ()
90 if (!m_SSAOMaterial && m_SSAOShader.isSupported)
92 m_SSAOMaterial = CreateMaterial (m_SSAOShader);
93 m_SSAOMaterial.SetTexture (
"_RandomTexture", m_RandomTexture);
98 void OnRenderImage (RenderTexture source, RenderTexture destination)
100 if (!m_Supported || !m_SSAOShader.isSupported) {
106 m_Downsampling = Mathf.Clamp (m_Downsampling, 1, 6);
107 m_Radius = Mathf.Clamp (m_Radius, 0.05f, 1.0f);
108 m_MinZ = Mathf.Clamp (m_MinZ, 0.00001f, 0.5f);
109 m_OcclusionIntensity = Mathf.Clamp (m_OcclusionIntensity, 0.5f, 4.0f);
110 m_OcclusionAttenuation = Mathf.Clamp (m_OcclusionAttenuation, 0.2f, 2.0f);
111 m_Blur = Mathf.Clamp (m_Blur, 0, 4);
114 RenderTexture rtAO = RenderTexture.GetTemporary (source.width / m_Downsampling, source.height / m_Downsampling, 0);
115 float fovY = GetComponent<Camera>().fieldOfView;
116 float far = GetComponent<Camera>().farClipPlane;
117 float y = Mathf.Tan (fovY * Mathf.Deg2Rad * 0.5f) * far;
118 float x = y * GetComponent<Camera>().aspect;
119 m_SSAOMaterial.SetVector (
"_FarCorner",
new Vector3(x,y,far));
120 int noiseWidth, noiseHeight;
121 if (m_RandomTexture) {
122 noiseWidth = m_RandomTexture.width;
123 noiseHeight = m_RandomTexture.height;
125 noiseWidth = 1; noiseHeight = 1;
127 m_SSAOMaterial.SetVector (
"_NoiseScale",
new Vector3 ((
float)rtAO.width / noiseWidth, (
float)rtAO.height / noiseHeight, 0.0f));
128 m_SSAOMaterial.SetVector (
"_Params",
new Vector4(
131 1.0f / m_OcclusionAttenuation,
132 m_OcclusionIntensity));
134 bool doBlur = m_Blur > 0;
135 Graphics.Blit (doBlur ? null : source, rtAO, m_SSAOMaterial, (int)m_SampleCount);
140 RenderTexture rtBlurX = RenderTexture.GetTemporary (source.width, source.height, 0);
141 m_SSAOMaterial.SetVector (
"_TexelOffsetScale",
142 new Vector4 ((
float)m_Blur / source.width, 0,0,0));
143 m_SSAOMaterial.SetTexture (
"_SSAO", rtAO);
144 Graphics.Blit (null, rtBlurX, m_SSAOMaterial, 3);
145 RenderTexture.ReleaseTemporary (rtAO);
148 RenderTexture rtBlurY = RenderTexture.GetTemporary (source.width, source.height, 0);
149 m_SSAOMaterial.SetVector (
"_TexelOffsetScale",
150 new Vector4 (0, (
float)m_Blur/source.height, 0,0));
151 m_SSAOMaterial.SetTexture (
"_SSAO", rtBlurX);
152 Graphics.Blit (source, rtBlurY, m_SSAOMaterial, 3);
153 RenderTexture.ReleaseTemporary (rtBlurX);
159 m_SSAOMaterial.SetTexture (
"_SSAO", rtAO);
160 Graphics.Blit (source, destination, m_SSAOMaterial, 4);
162 RenderTexture.ReleaseTemporary (rtAO);