7     [RequireComponent (typeof(Camera))]
     8     [AddComponentMenu(
"Image Effects/Rendering/Screen Space Ambient Occlusion")]
    19         public float m_Radius = 0.4f;
    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;
    43             Material m = 
new Material (shader);
    44             m.hideFlags = HideFlags.HideAndDontSave;
    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;
    90             if (!m_SSAOMaterial && m_SSAOShader.isSupported)
    92                 m_SSAOMaterial = CreateMaterial (m_SSAOShader);
    93                 m_SSAOMaterial.SetTexture (
"_RandomTexture", m_RandomTexture);
   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);
 void OnRenderImage(RenderTexture source, RenderTexture destination)
 
Texture2D m_RandomTexture
 
static void DestroyMaterial(Material mat)
 
static Material CreateMaterial(Shader shader)