using UnityEngine; using UnityEngine.Rendering; [RequireComponent(typeof(Camera)), // RequireComponent(typeof(SceneColorSetup)) ] public class PostProcesser : MonoBehaviour { [Header("Grass Overlaying Shaders")] public LayerMask grassLayer; public ShaderState grassState = ShaderState.On; public Shader grassReplacementShader; public float alphaThreshold = 0.5f; private GameObject _grassCameraObject; [Header("Pixel Shader")] public ShaderState pixelState = ShaderState.On; public bool dynamicPixelSize = false; public int screenHeight = 192; public float pixelsPerUnit = 24f; [Range(1f / 32f, 1)] public float zoom = 0.125f; [Header("Outline Shader")] public ShaderState outlineState = ShaderState.On; public Color outlineColor = Color.black; public Color edgeColor = Color.white; public float depthThreshold = 0.02f; public float normalThreshold = 0.05f; public Vector3 normalEdgeBias = Vector3.one; public float angleThreshold = 0.5f; public int angleFactorScale = 7; [Header("Cloud Shader")] public ShaderState cloudState = ShaderState.On; public Texture2D cloudsFineDetail; public Texture2D cloudsMediumDetail; public Texture2D cloudsLargeDetail; public Light lightSource; public float cloudSpeed = 0.1f; [Range(0, 1)] public float cloudThickness = 0.5f; [Range(0, 1)] public float cloudCoverage = 0.5f; [Range(0, 360)] public float cloudDirection = 30f; public float cloudZoom = 10f; public enum ShaderState { On, Off, Debug, } void OnEnable() { // Camera.main.depthTextureMode = DepthTextureMode.MotionVectors | DepthTextureMode.DepthNormals | DepthTextureMode.Depth; Camera.main.depthTextureMode = DepthTextureMode.DepthNormals | DepthTextureMode.Depth; if (grassState != ShaderState.Debug) Camera.main.cullingMask = ~(1 << (int)Mathf.Log(grassLayer.value, 2)); if (grassState == ShaderState.On && _grassCameraObject == null) { _grassCameraObject = new GameObject("GrassCamera"); _grassCameraObject.transform.SetParent(Camera.main.transform); _grassCameraObject.AddComponent(); } } void OnDisable() { if (_grassCameraObject != null) { Destroy(_grassCameraObject); _grassCameraObject = null; } } void UpdateZoom() { if (Camera.main == null) return; Camera.main.orthographicSize = 1 / zoom; var farPlane = 20 / zoom; var pos = Camera.main.transform.localPosition; pos.z = -farPlane / 2; Camera.main.transform.SetLocalPositionAndRotation(pos, Quaternion.identity); Camera.main.farClipPlane = farPlane; } void OnValidate() { UpdateZoom(); } void OnRenderImage(RenderTexture src, RenderTexture dest) { var outlineMaterial = CoreUtils.CreateEngineMaterial("Custom/PixelPerfectOutline"); outlineMaterial.SetFloat("_DepthThreshold", depthThreshold); outlineMaterial.SetFloat("_AngleThreshold", angleThreshold); outlineMaterial.SetFloat("_AngleFactorScale", angleFactorScale); outlineMaterial.SetFloat("_NormalThreshold", normalThreshold); outlineMaterial.SetVector("_NormalEdgeBias", normalEdgeBias); outlineMaterial.SetInteger("_DebugOutline", outlineState == ShaderState.Debug ? 1 : 0); outlineMaterial.SetColor("_OutlineColor", outlineColor); outlineMaterial.SetColor("_EdgeColor", edgeColor); var grassBlendingMaterial = CoreUtils.CreateEngineMaterial("Custom/GrassBlending"); grassBlendingMaterial.SetFloat("_AlphaThreshold", alphaThreshold); UpdateZoom(); var pixelScreenHeight = screenHeight; if (dynamicPixelSize) { pixelScreenHeight = (int)(1 / zoom * pixelsPerUnit); } var pixelScreenWidth = (int)(pixelScreenHeight * Camera.main.aspect + 0.5f); var tempTex = RenderTexture.GetTemporary(src.descriptor); var grassTex = RenderTexture.GetTemporary(src.descriptor); var cloudTex = RenderTexture.GetTemporary(2048, 2048); var screenSize = new Vector2(Screen.width, Screen.height); if (pixelState == ShaderState.On) { src.filterMode = FilterMode.Point; tempTex.Release(); tempTex.height = pixelScreenHeight; tempTex.width = pixelScreenWidth; tempTex.filterMode = FilterMode.Point; tempTex.Create(); grassTex.Release(); grassTex.height = pixelScreenHeight; grassTex.width = pixelScreenWidth; grassTex.filterMode = FilterMode.Point; grassTex.Create(); screenSize = new Vector2(pixelScreenWidth, pixelScreenHeight); } else { src.filterMode = FilterMode.Bilinear; tempTex.filterMode = FilterMode.Bilinear; tempTex.Release(); tempTex.Create(); grassTex.filterMode = FilterMode.Bilinear; grassTex.Release(); grassTex.Create(); } if (cloudState == ShaderState.On) { var cloudMaterial = CoreUtils.CreateEngineMaterial("Custom/Clouds"); cloudMaterial.SetFloat("_Speed", cloudSpeed); cloudMaterial.SetFloat("_Coverage", cloudCoverage); cloudMaterial.SetFloat("_Thickness", cloudThickness); cloudMaterial.SetFloat("_Direction", cloudDirection); cloudMaterial.SetTexture("_FineDetail", cloudsFineDetail); cloudMaterial.SetTexture("_MediumDetail", cloudsMediumDetail); cloudMaterial.SetTexture("_LargeDetail", cloudsLargeDetail); var cloudTexTemp = RenderTexture.GetTemporary(2048, 2048); cloudTexTemp.filterMode = FilterMode.Bilinear; cloudTexTemp.wrapMode = TextureWrapMode.Repeat; cloudTex.filterMode = FilterMode.Bilinear; cloudTex.wrapMode = TextureWrapMode.Repeat; Graphics.Blit(cloudTexTemp, cloudTex, cloudMaterial); RenderTexture.ReleaseTemporary(cloudTexTemp); lightSource.cookie = cloudTex; lightSource.cookieSize = cloudZoom; } else { lightSource.cookie = null; } outlineMaterial.SetVector("_ScreenSize", screenSize); Camera grassCamera = null; if (grassState == ShaderState.On) { grassCamera = _grassCameraObject.GetComponent(); grassCamera.enabled = false; } if (grassState == ShaderState.On && outlineState != ShaderState.Debug && grassCamera != null) { // var grassCameraObject = new GameObject("GrassCamera"); // grassCameraObject.transform.SetParent(Camera.main.transform); // var grassCamera = _grassCameraObject.GetComponent(); grassCamera.CopyFrom(Camera.main); grassCamera.targetTexture = grassTex; grassCamera.cullingMask = -1; grassCamera.clearFlags = CameraClearFlags.Nothing; grassCamera.enabled = true; grassCamera.RenderWithShader(grassReplacementShader, "RenderType"); grassCamera.enabled = false; // Destroy(grassCameraObject); grassBlendingMaterial.SetTexture("_GrassTex", grassTex); } if (outlineState != ShaderState.Off) { Graphics.Blit(src, tempTex, outlineMaterial); if (grassState == ShaderState.On && outlineState != ShaderState.Debug) Graphics.Blit(tempTex, dest, grassBlendingMaterial); else Graphics.Blit(tempTex, dest); } else if (grassState == ShaderState.On) { Graphics.Blit(src, tempTex, grassBlendingMaterial); Graphics.Blit(tempTex, dest); } else { Graphics.Blit(src, tempTex); Graphics.Blit(tempTex, dest); } if (grassCamera != null) grassCamera.targetTexture = null; RenderTexture.ReleaseTemporary(tempTex); RenderTexture.ReleaseTemporary(grassTex); RenderTexture.ReleaseTemporary(cloudTex); Graphics.SetRenderTarget(dest); } } // using UnityEngine; // using UnityEngine.Rendering; // [RequireComponent(typeof(Camera)), // RequireComponent(typeof(SceneColorSetup))] // public class PostProcesser : MonoBehaviour // { // [Header("Grass Overlaying Shaders")] // public LayerMask grassLayer; // public ShaderState grassState = ShaderState.On; // public Shader grassReplacementShader; // public float alphaThreshold = 0.5f; // private GameObject _grassCameraObject; // [Header("Pixel Shader")] // public ShaderState pixelState = ShaderState.On; // public bool dynamicPixelSize = false; // public int screenHeight = 192; // public float pixelsPerUnit = 24f; // [Range(1f / 32f, 1)] public float zoom = 0.125f; // [Header("Outline Shader")] // public ShaderState outlineState = ShaderState.On; // public Color outlineColor = Color.black; // public Color edgeColor = Color.white; // public float depthThreshold = 0.02f; // public float normalThreshold = 0.05f; // public Vector3 normalEdgeBias = Vector3.one; // public float angleThreshold = 0.5f; // public int angleFactorScale = 7; // [Header("Cloud Shader")] // public ShaderState cloudState = ShaderState.On; // public Texture2D cloudsFineDetail; // public Texture2D cloudsMediumDetail; // public Texture2D cloudsLargeDetail; // public Light lightSource; // public float cloudSpeed = 0.1f; // [Range(0, 1)] public float cloudThickness = 0.5f; // [Range(0, 1)] public float cloudCoverage = 0.5f; // [Range(0, 360)] public float cloudDirection = 30f; // public float cloudZoom = 10f; // public enum ShaderState // { // On, // Off, // Debug, // } // void OnEnable() // { // Camera.main.depthTextureMode = DepthTextureMode.DepthNormals; // if (grassState != ShaderState.Debug) // Camera.main.cullingMask = ~(1 << (int)Mathf.Log(grassLayer.value, 2)); // if (grassState == ShaderState.On && _grassCameraObject == null) // { // _grassCameraObject = new GameObject("GrassCamera"); // _grassCameraObject.transform.SetParent(Camera.main.transform); // _grassCameraObject.AddComponent(); // } // } // void OnDisable() // { // if (_grassCameraObject != null) // { // Destroy(_grassCameraObject); // _grassCameraObject = null; // } // } // void UpdateZoom() // { // if (Camera.main == null) // return; // Camera.main.orthographicSize = 1 / zoom; // var farPlane = 20 / zoom; // var pos = Camera.main.transform.localPosition; // pos.z = -farPlane / 2; // Camera.main.transform.SetLocalPositionAndRotation(pos, Quaternion.identity); // Camera.main.farClipPlane = farPlane; // } // void OnValidate() // { // UpdateZoom(); // } // void OnRenderImage(RenderTexture src, RenderTexture dest) // { // var outlineMaterial = CoreUtils.CreateEngineMaterial("Custom/PixelPerfectOutline"); // outlineMaterial.SetFloat("_DepthThreshold", depthThreshold); // outlineMaterial.SetFloat("_AngleThreshold", angleThreshold); // outlineMaterial.SetFloat("_AngleFactorScale", angleFactorScale); // outlineMaterial.SetFloat("_NormalThreshold", normalThreshold); // outlineMaterial.SetVector("_NormalEdgeBias", normalEdgeBias); // outlineMaterial.SetInteger("_DebugOutline", outlineState == ShaderState.Debug ? 1 : 0); // outlineMaterial.SetColor("_OutlineColor", outlineColor); // outlineMaterial.SetColor("_EdgeColor", edgeColor); // var grassBlendingMaterial = CoreUtils.CreateEngineMaterial("Custom/GrassBlending"); // grassBlendingMaterial.SetFloat("_AlphaThreshold", alphaThreshold); // UpdateZoom(); // var pixelScreenHeight = screenHeight; // if (dynamicPixelSize) // { // pixelScreenHeight = (int)(1 / zoom * pixelsPerUnit); // } // var pixelScreenWidth = (int)(pixelScreenHeight * Camera.main.aspect + 0.5f); // var tempTex = RenderTexture.GetTemporary(src.descriptor); // var grassTex = RenderTexture.GetTemporary(src.descriptor); // var cloudTex = RenderTexture.GetTemporary(2048, 2048); // var screenSize = new Vector2(Screen.width, Screen.height); // if (pixelState == ShaderState.On) // { // src.filterMode = FilterMode.Point; // tempTex.Release(); // tempTex.height = pixelScreenHeight; // tempTex.width = pixelScreenWidth; // tempTex.filterMode = FilterMode.Point; // tempTex.Create(); // grassTex.Release(); // grassTex.height = pixelScreenHeight; // grassTex.width = pixelScreenWidth; // grassTex.filterMode = FilterMode.Point; // grassTex.Create(); // screenSize = new Vector2(pixelScreenWidth, pixelScreenHeight); // } // else // { // src.filterMode = FilterMode.Bilinear; // tempTex.filterMode = FilterMode.Bilinear; // tempTex.Release(); // tempTex.Create(); // grassTex.filterMode = FilterMode.Bilinear; // grassTex.Release(); // grassTex.Create(); // } // if (cloudState == ShaderState.On) // { // var cloudMaterial = CoreUtils.CreateEngineMaterial("Custom/Clouds"); // cloudMaterial.SetFloat("_Speed", cloudSpeed); // cloudMaterial.SetFloat("_Coverage", cloudCoverage); // cloudMaterial.SetFloat("_Thickness", cloudThickness); // cloudMaterial.SetFloat("_Direction", cloudDirection); // cloudMaterial.SetTexture("_FineDetail", cloudsFineDetail); // cloudMaterial.SetTexture("_MediumDetail", cloudsMediumDetail); // cloudMaterial.SetTexture("_LargeDetail", cloudsLargeDetail); // var cloudTexTemp = RenderTexture.GetTemporary(2048, 2048); // cloudTexTemp.filterMode = FilterMode.Bilinear; // cloudTexTemp.wrapMode = TextureWrapMode.Repeat; // cloudTex.filterMode = FilterMode.Bilinear; // cloudTex.wrapMode = TextureWrapMode.Repeat; // Graphics.Blit(cloudTexTemp, cloudTex, cloudMaterial); // RenderTexture.ReleaseTemporary(cloudTexTemp); // lightSource.cookie = cloudTex; // lightSource.cookieSize = cloudZoom; // } // else // { // lightSource.cookie = null; // } // outlineMaterial.SetVector("_ScreenSize", screenSize); // var grassCamera = _grassCameraObject.GetComponent(); // if (grassState == ShaderState.On && outlineState != ShaderState.Debug) // { // grassCamera.CopyFrom(Camera.main); // grassCamera.targetTexture = grassTex; // grassCamera.cullingMask = -1; // grassCamera.clearFlags = CameraClearFlags.Nothing; // grassCamera.RenderWithShader(grassReplacementShader, "RenderType"); // grassBlendingMaterial.SetTexture("_GrassTex", grassTex); // } // if (outlineState != ShaderState.Off) // { // Graphics.Blit(src, tempTex, outlineMaterial); // if (grassState == ShaderState.On && outlineState != ShaderState.Debug) // Graphics.Blit(tempTex, dest, grassBlendingMaterial); // else // Graphics.Blit(tempTex, dest); // } // else if (grassState == ShaderState.On) // { // Graphics.Blit(src, tempTex, grassBlendingMaterial); // Graphics.Blit(tempTex, dest); // } // else // { // Graphics.Blit(src, tempTex); // Graphics.Blit(tempTex, dest); // } // if (grassCamera != null) // grassCamera.targetTexture = null; // RenderTexture.ReleaseTemporary(tempTex); // RenderTexture.ReleaseTemporary(grassTex); // RenderTexture.ReleaseTemporary(cloudTex); // Graphics.SetRenderTarget(dest); // } // }