using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[RequireComponent(typeof(Camera))]
|
|
[ImageEffectAllowedInSceneView]
|
|
[ExecuteInEditMode]
|
|
public class Pixelize : MonoBehaviour
|
|
{
|
|
#region Private Members
|
|
private Shader _screenAndMaskShader;
|
|
private Material _screenAndMaskMaterial;
|
|
private RenderTexture _temporaryRenderTexture;
|
|
private Shader _combineLayersShader;
|
|
private Material _combineLayersMaterial;
|
|
#endregion
|
|
|
|
#region Properties
|
|
private Shader ScreenAndMaskShader
|
|
{
|
|
get
|
|
{
|
|
if(_screenAndMaskShader == null)
|
|
{
|
|
_screenAndMaskShader = Shader.Find("Hidden/PostProcess/Pixelize/ScreenAndMask");
|
|
}
|
|
|
|
return _screenAndMaskShader;
|
|
}
|
|
}
|
|
|
|
private Material ScreenAndMaskMaterial
|
|
{
|
|
get
|
|
{
|
|
if(_screenAndMaskMaterial == null)
|
|
{
|
|
_screenAndMaskMaterial = new Material(ScreenAndMaskShader);
|
|
}
|
|
|
|
return _screenAndMaskMaterial;
|
|
}
|
|
}
|
|
|
|
private RenderTexture TemporaryRenderTarget
|
|
{
|
|
get
|
|
{
|
|
if(_temporaryRenderTexture == null)
|
|
{
|
|
CreateTemporaryRenderTarget();
|
|
}
|
|
|
|
return _temporaryRenderTexture;
|
|
}
|
|
}
|
|
|
|
private Shader CombineLayersShader
|
|
{
|
|
get
|
|
{
|
|
if(_combineLayersShader == null)
|
|
{
|
|
_combineLayersShader = Shader.Find("Hidden/PostProcess/Pixelize/CombineLayers");
|
|
}
|
|
|
|
return _combineLayersShader;
|
|
}
|
|
}
|
|
|
|
private Material CombineLayersMaterial
|
|
{
|
|
get
|
|
{
|
|
if(_combineLayersMaterial == null)
|
|
{
|
|
_combineLayersMaterial = new Material(CombineLayersShader);
|
|
}
|
|
|
|
return _combineLayersMaterial;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Functions
|
|
void OnRenderImage(RenderTexture src, RenderTexture dest)
|
|
{
|
|
CheckTemporaryRenderTarget();
|
|
|
|
Graphics.Blit(src, TemporaryRenderTarget, ScreenAndMaskMaterial);
|
|
|
|
Graphics.Blit(TemporaryRenderTarget, dest, CombineLayersMaterial);
|
|
}
|
|
|
|
private void CreateTemporaryRenderTarget()
|
|
{
|
|
_temporaryRenderTexture = new RenderTexture(Screen.width, Screen.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); // better bit precision on Alpha would be preferable but 8 is enough for the current pixelization effect which is already banded
|
|
_temporaryRenderTexture.useMipMap = true;
|
|
_temporaryRenderTexture.autoGenerateMips = true;
|
|
_temporaryRenderTexture.wrapMode = TextureWrapMode.Clamp;
|
|
_temporaryRenderTexture.filterMode = FilterMode.Point;
|
|
_temporaryRenderTexture.Create();
|
|
}
|
|
|
|
private void CheckTemporaryRenderTarget()
|
|
{
|
|
if(TemporaryRenderTarget.width != Screen.width || TemporaryRenderTarget.width != Screen.height)
|
|
{
|
|
ReleaseTemporaryRenderTarget();
|
|
}
|
|
}
|
|
|
|
private void ReleaseTemporaryRenderTarget()
|
|
{
|
|
_temporaryRenderTexture.Release();
|
|
_temporaryRenderTexture = null;
|
|
}
|
|
#endregion
|
|
}
|