Last active
January 3, 2018 20:16
-
-
Save demonixis/1476cb24171afe0a0187d5a9082797dd to your computer and use it in GitHub Desktop.
A distortion correction effect for Unity.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
namespace OSVR.Unity | |
{ | |
[ExecuteInEditMode] | |
[RequireComponent(typeof(Camera))] | |
public sealed class OsvrDistortion : MonoBehaviour | |
{ | |
private bool isSupported = true; | |
private Material distortionMaterial = null; | |
private Shader distortionShader = null; | |
public float K1Red = 0.0f; | |
public float K1Green = 0.0f; | |
public float K1Blue = 0.0f; | |
public Vector4 _Center = new Vector4(0.5f, 0.5f, 0.0f, 0.0f); | |
private void Start() | |
{ | |
CheckResources(); | |
} | |
private void OnEnable() | |
{ | |
isSupported = true; | |
} | |
private void OnRenderImage(RenderTexture source, RenderTexture destination) | |
{ | |
if (CheckResources() == false) | |
{ | |
Graphics.Blit(source, destination); | |
return; | |
} | |
distortionMaterial.SetFloat("_K1_Red", K1Red); | |
distortionMaterial.SetFloat("_K1_Green", K1Green); | |
distortionMaterial.SetFloat("_K1_Blue", K1Blue); | |
distortionMaterial.SetVector("_Center", _Center); | |
Graphics.Blit(source, destination, distortionMaterial); | |
} | |
private Material CheckShaderAndCreateMaterial(Shader shader, Material materialToCreate) | |
{ | |
shader = distortionShader = Shader.Find("Osvr/OsvrDistortion"); | |
if (!shader) | |
{ | |
Debug.Log("Missing shader in " + ToString()); | |
enabled = false; | |
return null; | |
} | |
if (shader.isSupported && materialToCreate && materialToCreate.shader == shader) | |
return materialToCreate; | |
if (!shader.isSupported) | |
{ | |
NotSupported(); | |
Debug.Log("The shader " + shader.ToString() + " on effect " + ToString() + " is not supported on this platform!"); | |
return null; | |
} | |
else | |
{ | |
materialToCreate = new Material(shader); | |
materialToCreate.hideFlags = HideFlags.DontSave; | |
if (materialToCreate) | |
return materialToCreate; | |
else | |
return null; | |
} | |
} | |
private bool CheckResources() | |
{ | |
CheckSupport(); | |
distortionMaterial = CheckShaderAndCreateMaterial(distortionShader, distortionMaterial); | |
if (!isSupported) | |
Debug.LogWarning("The image effect " + ToString() + " has been disabled as it's not supported on the current platform."); | |
return isSupported; | |
} | |
private bool CheckSupport() | |
{ | |
isSupported = true; | |
if (!SystemInfo.supportsImageEffects) | |
{ | |
NotSupported(); | |
return false; | |
} | |
return true; | |
} | |
private void NotSupported() | |
{ | |
enabled = false; | |
isSupported = false; | |
return; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment