4 namespace UnityStandardAssets.ImageEffects
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;
36 public Shader shaderLum;
37 private Material m_materialLum;
38 protected Material materialLum {
40 if ( m_materialLum == null ) {
41 m_materialLum =
new Material(shaderLum);
42 m_materialLum.hideFlags = HideFlags.HideAndDontSave;
51 public Shader shaderReduce;
52 private Material m_materialReduce;
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;
65 public Shader shaderAdapt;
66 private Material m_materialAdapt;
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;
79 public Shader shaderApply;
80 private Material m_materialApply;
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 );
135 void OnRenderImage (RenderTexture source, RenderTexture destination)
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 );
173 private void CalculateAdaptation( Texture curTexture )
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],