Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

119 lines
2.6 KiB

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
}