using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityStandardAssets.ImageEffects; [ExecuteInEditMode] [RequireComponent(typeof(Camera))] [AddComponentMenu("Image Effects/Blur/Blur (Optimized) Stereo")] public class BlurOptimizedStereo : PostEffectsBase { [Range(0, 2)] public int downsample = 1; public enum BlurType { StandardGauss = 0, SgxGauss = 1, } [Range(0.0f, 10.0f)] public float blurSize = 3.0f; [Range(1, 4)] public int blurIterations = 2; public BlurType blurType = BlurType.StandardGauss; public Shader blurShader = null; private Material blurMaterial = null; private Material bypassStereoMaterial = null; private Shader bypassStereoShader = null; public override bool CheckResources() { CheckSupport(false); if(blurShader == null) { blurShader = Shader.Find("Hidden/FastBlur"); } blurMaterial = CheckShaderAndCreateMaterial(blurShader, blurMaterial); if (bypassStereoMaterial == null) { bypassStereoShader = Shader.Find("Hidden/BypassStereoImageEffectShader"); bypassStereoMaterial = new Material(bypassStereoShader); } if (!isSupported) ReportAutoDisable(); return isSupported; } public void OnDisable() { if (blurMaterial) DestroyImmediate(blurMaterial); } public void OnRenderImage(RenderTexture source, RenderTexture destination) { if (CheckResources() == false) { Graphics.Blit(source, destination); return; } float widthMod = 1.0f / (1.0f * (1 << downsample)); blurMaterial.SetVector("_Parameter", new Vector4(blurSize * widthMod, -blurSize * widthMod, 0.0f, 0.0f)); source.filterMode = FilterMode.Bilinear; int rtW = source.width >> downsample; int rtH = source.height >> downsample; // downsample RenderTexture rt = RenderTexture.GetTemporary(rtW, rtH, 0, source.format); rt.filterMode = FilterMode.Bilinear; Graphics.Blit(source, rt, blurMaterial, 0); var passOffs = blurType == BlurType.StandardGauss ? 0 : 2; for (int i = 0; i < blurIterations; i++) { float iterationOffs = (i * 1.0f); blurMaterial.SetVector("_Parameter", new Vector4(blurSize * widthMod + iterationOffs, -blurSize * widthMod - iterationOffs, 0.0f, 0.0f)); // vertical blur RenderTexture rt2 = RenderTexture.GetTemporary(rtW, rtH, 0, source.format); rt2.filterMode = FilterMode.Bilinear; Graphics.Blit(rt, rt2, blurMaterial, 1 + passOffs); RenderTexture.ReleaseTemporary(rt); rt = rt2; // horizontal blur rt2 = RenderTexture.GetTemporary(rtW, rtH, 0, source.format); rt2.filterMode = FilterMode.Bilinear; Graphics.Blit(rt, rt2, blurMaterial, 2 + passOffs); RenderTexture.ReleaseTemporary(rt); rt = rt2; } Graphics.Blit(rt, destination, bypassStereoMaterial); RenderTexture.ReleaseTemporary(rt); } } Shader "Hidden/BypassStereoImageEffectShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { // No culling or depth Cull Off ZWrite Off ZTest Always Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); //o.uv = v.uv; o.uv = UnityStereoScreenSpaceUVAdjust(v.uv, _MainTex_ST); return o; } fixed4 frag (v2f i) : SV_Target { #if UNITY_SINGLE_PASS_STEREO if (unity_StereoEyeIndex == 0)//left eye { i.uv.x = i.uv.x * 0.5; } else//right eye { i.uv.x = i.uv.x * 0.5 + 0.5; } #endif fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } }
2018年12月20日 星期四
[Unity] fixed legacy blur effect from Unity Standard Assets for single pass stereo
https://assetstore.unity.com/packages/essentials/legacy-image-effects-83913
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言