¾Æ·¡ À̹ÌÁö¿Í °°ÀÌ ±íÀÌ ¸ðµå¸¦ ȸ鿡 Ãâ·ÂÇغ¸ÀÚ. [±íÀÌ°¡ 0.2À϶§] SceneDepth_ImageEffect.cs ½ºÅ©¸³Æ® ÆÄÀÏ ¸¸µé±âusing UnityEngine;
using System.Collections; [ExecuteInEditMode] public class SceneDepth_ImageEffect : MonoBehaviour { #region Variables public Shader curShader; private Material curMaterial; [Range(0.0f, 5.0f)] public float depthPower = 1.0f; #endregion #region Properties Material material { get { if(curMaterial == null) { curMaterial = new Material(curShader); curMaterial.hideFlags = HideFlags.HideAndDontSave; } return curMaterial; } } #endregion void Start() { if(!SystemInfo.supportsImageEffects) { enabled = false; return; } if(!curShader && !curShader.isSupported) { enabled = false; } } void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture) { if(curShader != null) { material.SetFloat("_DepthPower", depthPower); Graphics.Blit(sourceTexture, destTexture, material); } else { Graphics.Blit(sourceTexture, destTexture); } } /* void Update() { Camera.main.depthTextureMode = DepthTextureMode.Depth; depthPower = Mathf.Clamp(depthPower, 0, 5); } */ void OnDisable() { if(curMaterial) { DestroyImmediate(curMaterial); } } } 1. À¯´ÏƼ ¿¡µðÅÍ ¸ðµå¿¡¼µµ ½ÇÇàÇϱâ À§ÇØ ´ÙÀ½À» ¼±¾ðÇÑ´Ù. [ExecuteInEditMode] 2. º¯¼ö¸¦ ¼±¾ðÇÑ´Ù. ¸ÞÆ®¸®¾óÀ» ÀÚüÀûÀ¸·Î »ý¼ºÇÏ°í ¼ÎÀÌ´õ¸¦ ÂüÁ¶Çϱâ À§ÇÑ º¯¼ö¸¦ Ãß°¡ÇÑ´Ù. depthPower´Â ¼ÎÀÌ´õ·Î depthPowerÀ» ³Ñ°ÜÁÖ±â À§ÇÑ º¯¼öÀÌ´Ù. #region Variables public Shader curShader; private Material curMaterial; [Range(0.0f, 5.0f)] public float depthPower = 1.0f; #endregion 3. ¸ÅÆ®¸®¾óÀ» »ý¼ºÇÑ´Ù. ¸ÅÆ®¸®¾óÀÌ nullÀÌ¸é »ý¼ºÇÑ´Ù. °èÃþºä¿¡¼ ¼û±â°í ÀúÀåÀÌ ÇÊ¿ä ¾ø±â ¶§¹®¿¡ HideAndDontSave·Î ¼³Á¤ÇÑ´Ù. #region Properties Material material { get { if(curMaterial == null) { curMaterial = new Material(curShader); curMaterial.hideFlags = HideFlags.HideAndDontSave; } return curMaterial; } } #endregion 4. À̹ÌÁö ÀÌÆåÆ® Áö¿ø ¿©ºÎ¸¦ üũ ÇÑ´Ù. À̹ÌÁö ÀÌÆåÆ®¿Í ¼ÎÀÌ´õ Áö¿øÀÌ µÇ´ÂÁö üũ ÇÏ¿© ½ºÅ©¸³Æ®¸¦ È°¼º, ºñÈ°¼ºÈ ÇÑ´Ù. void Start() { if(!SystemInfo.supportsImageEffects) { enabled = false; return; } if(!curShader && !curShader.isSupported) { enabled = false; } } 5. À̹ÌÁö¸¦ ĸÃÄÇؼ ³Ñ°ÜÁØ´Ù. À¯´ÏƼ¿¡¼´Â À̹ÌÁö¸¦ ĸÃÄÇϱâ À§ÇØ OnRenderImage( ) ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. ¼ÎÀÌ´õ¿¡¼´Â _MainTex·Î ¹Þ´Â´Ù. void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture) { if(curShader != null) { material.SetFloat("_LuminosityAmount", grayScaleAmount); Graphics.Blit(sourceTexture, destTexture, material); } else { Graphics.Blit(sourceTexture, destTexture); } } 6. »ý¼ºÇß´ø ¸ÅÆ®¸®¾óÀ» ÇØÁ¦ÇÑ´Ù. void OnDisable() { if(curMaterial) { DestroyImmediate(curMaterial); } } OnDestroy°¡ ¾Æ´Ï¶ó OnDisable¿¡¼ ¸ÞÆ®¸®¾óÀ» ÇØÁ¦ÇÏ°í ÀÖ´Ù. À̺κÐÀº ÀÌÇØ°¡ ¾È°£´Ù. ??? À̺¥Æ®ÀÇ ½ÇÇà ¼ø¼´Â ´ÙÀ½°ú °°´Ù. SceneDepth_Shader.shader ¸¸µé±âShader "Custom/SceneDepth_Shader"
{ Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _DepthPower ("Depth Power", Range(1, 5)) = 1 } SubShader { Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" uniform sampler2D _MainTex; fixed _DepthPower; sampler2D _CameraDepthTexture; fixed4 frag(v2f_img i) : COLOR { //Get the colors from the RenderTexture and the uv's //from the v2f_img struct float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) ); d = pow(Linear01Depth(d), _DepthPower); return d; } ENDCG } } FallBack off } 1. ·»´õ¸µ À̹ÌÁö¿Í ±×·¹À̽ºÄÉÀÏ°ª¿ëÀ¸·Î ÇÁ·ÎÆÛƼ¸¦ ¸¸µç´Ù. Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _DepthPower ("Depth Power", Range(1, 5)) = 1 } ȸ鿡 ·»´õ¸µ ÇÏ´Â ´ë½Å¿¡ ÅؽºÃÄ¿¡ ·»´õ¸µÇÑ´Ù. À̹ÌÁö¸¦ _MainTex ÅؽºÃÄ¿¡ ·»´õ¸µÇÑ´Ù. 2. Cg ¼ÎÀÌ´õ Äڵ带 »ç¿ëÇÏ¿© ȸéÀ» ÃÖÀûÈ ÇÑ´Ù. ³»Àå ¼Çǽº ¼ÎÀÌ´õ ÄÚµå ´ë½Å Cg ¼ÎÀÌ´õ ÄÚµå¿Í Cg ¼ÎÀÌ´õ ÄÚµå¿ë #pragma ¹®À» Àû¿ëÇÑ´Ù. SubShader { Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" 3. º¯¼ö¸¦ ¼±¾ðÇÑ´Ù. uniform sampler2D _MainTex; fixed _DepthPower; sampler2D _CameraDepthTexture; 4. ·»´õ¸µµÈ ÅؽºÃÄ À̹ÌÁö¿¡ È¿°ú¸¦ ÁØ´Ù. ¿©±â¼ frag( ) ÇÔ¼ö´Â Depth¸¦ ȸ鿡 ±×·ÁÁÖ´Â È¿°ú¸¦ ÁÖ°í ÀÖ´Ù. fixed4 frag(v2f_img i) : COLOR { //Get the colors from the RenderTexture and the uv's //from the v2f_img struct float d = UNITY_SAMPLE_DEPTH( tex2D(_CameraDepthTexture, i.uv.xy) ); d = pow(Linear01Depth(d), _DepthPower); return d; } À¯´ÏƼ°¡ Á¦°øÇÏ´Â ³»Àå ÇÔ¼ö UNITY_SAMPLE_DEPTH( )¿Í Linear01Depth( )·Î ±íÀÌÁ¤º¸¸¦ ±¸ÇÒ¼ö ÀÖ´Ù. UNITY_SAMPLE_DEPTH : ±íÀÌ Á¤º¸¸¦ °¡Á®¿Â´Ù. Linear01Depth : °ªÀÌ 0 ~ 1 ¹üÀ§·Î °ªÀ» Á¶Á¤ÇÑ´Ù. ÃÖÁ¾ °ªÀ» °ÅµìÁ¦°öÀ» ÇÏ¿© Ä«¸Þ¶ó À§Ä¡¿¡ ±â¹ÝÇØ ¾À ¾È¿¡¼ 0 ~ 1 ¹üÀ§ÀÇ Áß°£ °ªÀ¸·Î À§Ä¡¸¦ Á¦¾î ÇÑ´Ù. ½ºÅ©¸³Æ® Àû¿ëÄ«¸Þ¶ó¿¡ GrayCameraRenderImage.cs¸¦ ºÙÀδÙ.SceneDepth_ImageEffect.cs ¼Ò½º SceneDepth_Shader.shader ¼Ò½º Âü°í) À¯´ÏƼ Shader¿Í Effect Á¦ÀÛ (µµ¼) |