資源簡介
將Depth of Filed 掛載相機上,將Shader導入腳本中,然后調節數值,直到達到效果就好了

代碼片段和文件信息
using?UnityEngine;
using?System.Collections;
[ExecuteInEditMode]
public?class?DepthOfFiled?:?PostEffectbase
{
????[Range(0.0f?100.0f)]
????public?float?focalDistance?=?10.0f;
????[Range(0.0f?100.0f)]
????public?float?nearBlurScale?=?0.0f;
????[Range(0.0f?1000.0f)]
????public?float?farBlurScale?=?50.0f;
????//分辨率
????public?int?downSample?=?1;
????//采樣率
????public?int?samplerScale?=?1;
????private?Camera?_mainCam?=?null;
????public?Camera?MainCam
????{
????????get
????????{
????????????if?(_mainCam?==?null)
????????????????_mainCam?=?GetComponent();
????????????return?_mainCam;
????????}
????}
????void?OnEnable()
????{
????????//maincam的depthTextureMode是通過位運算開啟與關閉的
????????MainCam.depthTextureMode?|=?DepthTextureMode.Depth;
????}
????void?OnDisable()
????{
????????MainCam.depthTextureMode?&=?~DepthTextureMode.Depth;
????}
????void?OnRenderImage(RenderTexture?source?RenderTexture?destination)
????{
????????if?(_Material)
????????{
????????????//首先將我們設置的焦點限制在遠近裁剪面之間
????????????Mathf.Clamp(focalDistance?MainCam.nearClipPlane?MainCam.farClipPlane);
????????????//申請兩塊RT,并且分辨率按照downSameple降低
????????????RenderTexture?temp1?=?RenderTexture.GetTemporary(source.width?>>?downSample?source.height?>>?downSample?0?source.format);
????????????RenderTexture?temp2?=?RenderTexture.GetTemporary(source.width?>>?downSample?source.height?>>?downSample?0?source.format);
????????????//直接將場景圖拷貝到低分辨率的RT上達到降分辨率的效果
????????????Graphics.Blit(source?temp1);
????????????//高斯模糊,兩次模糊,橫向縱向,使用pass0進行高斯模糊
????????????_Material.SetVector(“_offsets“?new?Vector4(0?samplerScale?0?0));
????????????Graphics.Blit(temp1?temp2?_Material?0);
????????????_Material.SetVector(“_offsets“?new?Vector4(samplerScale?0?0?0));
????????????Graphics.Blit(temp2?temp1?_Material?0);
????????????//景深操作,景深需要兩的模糊效果圖我們通過_BlurTex變量傳入shader
????????????_Material.SetTexture(“_BlurTex“?temp1);
????????????//設置shader的參數,主要是焦點和遠近模糊的權重,權重可以控制插值時使用模糊圖片的權重
????????????_Material.SetFloat(“_focalDistance“?FocalDistance01(focalDistance));
????????????_Material.SetFloat(“_nearBlurScale“?nearBlurScale);
????????????_Material.SetFloat(“_farBlurScale“?farBlurScale);
????????????//使用pass1進行景深效果計算,清晰場景圖直接從source輸入到shader的_MainTex中
????????????Graphics.Blit(source?destination?_Material?1);
????????????//釋放申請的RT
????????????RenderTexture.ReleaseTemporary(temp1);
????????????RenderTexture.ReleaseTemporary(temp2);
????????}
????}
????//計算設置的焦點被轉換到01空間中的距離,以便shader中通過這個01空間的焦點距離與depth比較
????private?float?FocalDistance01(float?distance)
????{
????????return?MainCam.WorldToViewportPoint((distance?-?MainCam.nearClipPlane)?*?MainCam.transform.forward?+?MainCam.transform.position).z?/?(MainCam.farClipPlane?-?MainCam.nearClipPlane);
????}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2020-01-11?10:59??景深效果\
?????文件????????4222??2020-01-11?10:40??景深效果\DepthOfField.shader
?????文件????????3292??2020-01-11?10:40??景深效果\DepthOfFiled.cs
?????文件????????1158??2020-01-11?10:42??景深效果\PostEffectba
評論
共有 條評論