7     [AddComponentMenu(
"Image Effects/Color Adjustments/Contrast Stretch")]
    12         [Range(0.0001f, 1.0f)]
    13         public float adaptationSpeed = 0.02f;
    22         public float limitMinimum = 0.2f;
    26         public float limitMaximum = 0.6f;
    31         private RenderTexture[] adaptRenderTex = 
new RenderTexture[2];
    32         private int curAdaptIndex = 0;
    38         protected Material materialLum {
    40                 if ( m_materialLum == null ) {
    41                     m_materialLum = 
new Material(shaderLum);
    42                     m_materialLum.hideFlags = HideFlags.HideAndDontSave;
    53         protected Material materialReduce {
    55                 if ( m_materialReduce == null ) {
    56                     m_materialReduce = 
new Material(shaderReduce);
    57                     m_materialReduce.hideFlags = HideFlags.HideAndDontSave;
    59                 return m_materialReduce;
    67         protected Material materialAdapt {
    69                 if ( m_materialAdapt == null ) {
    70                     m_materialAdapt = 
new Material(shaderAdapt);
    71                     m_materialAdapt.hideFlags = HideFlags.HideAndDontSave;
    73                 return m_materialAdapt;
    81         protected Material materialApply {
    83                 if ( m_materialApply == null ) {
    84                     m_materialApply = 
new Material(shaderApply);
    85                     m_materialApply.hideFlags = HideFlags.HideAndDontSave;
    87                 return m_materialApply;
    94             if (!SystemInfo.supportsImageEffects) {
    99             if (!shaderAdapt.isSupported || !shaderApply.isSupported || !shaderLum.isSupported || !shaderReduce.isSupported) {
   107             for( 
int i = 0; i < 2; ++i )
   109                 if ( !adaptRenderTex[i] ) {
   110                     adaptRenderTex[i] = 
new RenderTexture(1, 1, 0);
   111                     adaptRenderTex[i].hideFlags = HideFlags.HideAndDontSave;
   118             for( 
int i = 0; i < 2; ++i )
   120                 DestroyImmediate( adaptRenderTex[i] );
   121                 adaptRenderTex[i] = null;
   124                 DestroyImmediate( m_materialLum );
   125             if ( m_materialReduce )
   126                 DestroyImmediate( m_materialReduce );
   127             if ( m_materialAdapt )
   128                 DestroyImmediate( m_materialAdapt );
   129             if ( m_materialApply )
   130                 DestroyImmediate( m_materialApply );
   138             const int TEMP_RATIO = 1; 
   139             RenderTexture rtTempSrc = RenderTexture.GetTemporary(source.width/TEMP_RATIO, source.height/TEMP_RATIO);
   140             Graphics.Blit (source, rtTempSrc, materialLum);
   144             const int FINAL_SIZE = 1;
   146             while( rtTempSrc.width > FINAL_SIZE || rtTempSrc.height > FINAL_SIZE )
   148                 const int REDUCE_RATIO = 2; 
   149                 int destW = rtTempSrc.width / REDUCE_RATIO;
   150                 if ( destW < FINAL_SIZE ) destW = FINAL_SIZE;
   151                 int destH = rtTempSrc.height / REDUCE_RATIO;
   152                 if ( destH < FINAL_SIZE ) destH = FINAL_SIZE;
   153                 RenderTexture rtTempDst = RenderTexture.GetTemporary(destW,destH);
   154                 Graphics.Blit (rtTempSrc, rtTempDst, materialReduce);
   157                 RenderTexture.ReleaseTemporary( rtTempSrc );
   158                 rtTempSrc = rtTempDst;
   162             CalculateAdaptation( rtTempSrc );
   165             materialApply.SetTexture(
"_AdaptTex", adaptRenderTex[curAdaptIndex] );
   166             Graphics.Blit (source, destination, materialApply);
   168             RenderTexture.ReleaseTemporary( rtTempSrc );
   175             int prevAdaptIndex = curAdaptIndex;
   176             curAdaptIndex = (curAdaptIndex+1) % 2;
   180             float adaptLerp = 1.0f - Mathf.Pow( 1.0f - adaptationSpeed, 30.0f * Time.deltaTime );
   181             const float kMinAdaptLerp = 0.01f;
   182             adaptLerp = Mathf.Clamp( adaptLerp, kMinAdaptLerp, 1 );
   184             materialAdapt.SetTexture(
"_CurTex", curTexture );
   185             materialAdapt.SetVector(
"_AdaptParams", 
new Vector4(
   192             Graphics.SetRenderTarget(adaptRenderTex[curAdaptIndex]);
   193             GL.Clear(
false, 
true, Color.black);
   195                 adaptRenderTex[prevAdaptIndex],
   196                 adaptRenderTex[curAdaptIndex],
 
Material m_materialReduce
 
void CalculateAdaptation(Texture curTexture)
Helper function to do gradual adaptation to min/max luminances. 
 
void OnRenderImage(RenderTexture source, RenderTexture destination)
Apply the filter.