From 519ae68848b599b7a72b7e06fac35076d7727d3e Mon Sep 17 00:00:00 2001 From: Samuel Bouchet Date: Fri, 13 Oct 2023 10:40:35 +0200 Subject: [PATCH] Add curvature to CRT shader effect. Also add a 'curvatureScale' property to provides control for the level of curvature simulated by the CRT shader. --- .../Editor/CRTPostEffecterEditor.cs | 2 ++ .../SimpleCRTShader/Script/CRTPostEffecter.cs | 5 +++++ Assets/SimpleCRTShader/material/CRT.mat | 8 ++++++-- Assets/SimpleCRTShader/shader/CRT.shader | 19 +++++++++++++++++-- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Assets/SimpleCRTShader/Editor/CRTPostEffecterEditor.cs b/Assets/SimpleCRTShader/Editor/CRTPostEffecterEditor.cs index 938c1b6..37bd162 100644 --- a/Assets/SimpleCRTShader/Editor/CRTPostEffecterEditor.cs +++ b/Assets/SimpleCRTShader/Editor/CRTPostEffecterEditor.cs @@ -13,6 +13,8 @@ public override void OnInspectorGUI() CRTPostEffecter effect = target as CRTPostEffecter; effect.material = (Material)EditorGUILayout.ObjectField("Effect Material", effect.material, typeof(Material), false); + effect.curvatureScale = EditorGUILayout.FloatField("Curvature", effect.curvatureScale); + using (new HorizontalScope(GUI.skin.box)) { effect.whiteNoiseFrequency = EditorGUILayout.IntField("White Noise Freaquency (x/1000)", effect.whiteNoiseFrequency); diff --git a/Assets/SimpleCRTShader/Script/CRTPostEffecter.cs b/Assets/SimpleCRTShader/Script/CRTPostEffecter.cs index 3e4e3b6..53af836 100644 --- a/Assets/SimpleCRTShader/Script/CRTPostEffecter.cs +++ b/Assets/SimpleCRTShader/Script/CRTPostEffecter.cs @@ -4,6 +4,7 @@ public class CRTPostEffecter : MonoBehaviour { public Material material; + public float curvatureScale = -0.1f; public int whiteNoiseFrequency = 1; public float whiteNoiseLength = 0.1f; private float whiteNoiseTimeLeft; @@ -54,6 +55,7 @@ public enum LeterBoxType public Vector2Int resolutions; #region Properties in shader + private int _CurvatureScale; private int _WhiteNoiseOnOff; private int _ScanlineOnOff; private int _MonochormeOnOff; @@ -83,6 +85,7 @@ public enum LeterBoxType private void Start() { + _CurvatureScale = Shader.PropertyToID("_CurvatureScale"); _WhiteNoiseOnOff = Shader.PropertyToID("_WhiteNoiseOnOff"); _ScanlineOnOff = Shader.PropertyToID("_ScanlineOnOff"); _MonochormeOnOff = Shader.PropertyToID("_MonochormeOnOff"); @@ -127,6 +130,8 @@ private void OnRenderImage(RenderTexture src, RenderTexture dest) } ////// + material.SetFloat(_CurvatureScale, curvatureScale); + material.SetInteger(_LetterBoxOnOff, isLetterBox ? 0 : 1); //material.SetInteger(_LetterBoxEdgeBlurOnOff, isLetterBoxEdgeBlur ? 0 : 1); material.SetInteger(_LetterBoxType, (int)letterBoxType); diff --git a/Assets/SimpleCRTShader/material/CRT.mat b/Assets/SimpleCRTShader/material/CRT.mat index 93a39e7..004d771 100644 --- a/Assets/SimpleCRTShader/material/CRT.mat +++ b/Assets/SimpleCRTShader/material/CRT.mat @@ -2,20 +2,24 @@ %TAG !u! tag:unity3d.com,2011: --- !u!21 &2100000 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: CRT m_Shader: {fileID: 4800000, guid: fd1d99cddfb7f5644bbd3d844f92ab11, type: 3} - m_ShaderKeywords: + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 m_CustomRenderQueue: -1 stringTagMap: {} disabledShaderPasses: [] + m_LockedProperties: m_SavedProperties: serializedVersion: 3 m_TexEnvs: diff --git a/Assets/SimpleCRTShader/shader/CRT.shader b/Assets/SimpleCRTShader/shader/CRT.shader index 1ba885a..1431f08 100644 --- a/Assets/SimpleCRTShader/shader/CRT.shader +++ b/Assets/SimpleCRTShader/shader/CRT.shader @@ -36,6 +36,8 @@ Shader "Simple CRT" float4 _MainTex_ST; float4 _MainTex_TexelSize; + float _CurvatureScale; + int _WhiteNoiseOnOff; int _ScanlineOnOff; int _MonochormeOnOff; @@ -75,7 +77,16 @@ Shader "Simple CRT" float GetRandom(float x); float EaseIn(float t0, float t1, float t); - v2f vert (appdata v) + float2 Distort(float2 uv) + { + float2 center = float2(0.5, 0.5); + uv = uv - center; + float len = length(uv); + uv = uv / (1.0 + len * _CurvatureScale); + return uv * (1 + (_CurvatureScale * 0.5)) + center; + } + + v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); @@ -86,7 +97,11 @@ Shader "Simple CRT" fixed4 frag (v2f i) : SV_Target { - float2 uv = i.uv; + float2 uv = Distort(i.uv); + if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) + { + return fixed4(0.0, 0.0, 0.0, 1.0); // Return black color for outbound pixels + } /////Jump noise uv.y = frac(uv.y + _ScreenJumpLevel);