資源簡(jiǎn)介
將Depth of Filed 掛載相機(jī)上,將Shader導(dǎo)入腳本中,然后調(diào)節(jié)數(shù)值,直到達(dá)到效果就好了

代碼片段和文件信息
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是通過(guò)位運(yùn)算開(kāi)啟與關(guān)閉的
????????MainCam.depthTextureMode?|=?DepthTextureMode.Depth;
????}
????void?OnDisable()
????{
????????MainCam.depthTextureMode?&=?~DepthTextureMode.Depth;
????}
????void?OnRenderImage(RenderTexture?source?RenderTexture?destination)
????{
????????if?(_Material)
????????{
????????????//首先將我們?cè)O(shè)置的焦點(diǎn)限制在遠(yuǎn)近裁剪面之間
????????????Mathf.Clamp(focalDistance?MainCam.nearClipPlane?MainCam.farClipPlane);
????????????//申請(qǐng)兩塊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);
????????????//直接將場(chǎng)景圖拷貝到低分辨率的RT上達(dá)到降分辨率的效果
????????????Graphics.Blit(source?temp1);
????????????//高斯模糊,兩次模糊,橫向縱向,使用pass0進(jìn)行高斯模糊
????????????_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);
????????????//景深操作,景深需要兩的模糊效果圖我們通過(guò)_BlurTex變量傳入shader
????????????_Material.SetTexture(“_BlurTex“?temp1);
????????????//設(shè)置shader的參數(shù),主要是焦點(diǎn)和遠(yuǎn)近模糊的權(quán)重,權(quán)重可以控制插值時(shí)使用模糊圖片的權(quán)重
????????????_Material.SetFloat(“_focalDistance“?FocalDistance01(focalDistance));
????????????_Material.SetFloat(“_nearBlurScale“?nearBlurScale);
????????????_Material.SetFloat(“_farBlurScale“?farBlurScale);
????????????//使用pass1進(jìn)行景深效果計(jì)算,清晰場(chǎng)景圖直接從source輸入到shader的_MainTex中
????????????Graphics.Blit(source?destination?_Material?1);
????????????//釋放申請(qǐng)的RT
????????????RenderTexture.ReleaseTemporary(temp1);
????????????RenderTexture.ReleaseTemporary(temp2);
????????}
????}
????//計(jì)算設(shè)置的焦點(diǎn)被轉(zhuǎn)換到01空間中的距離,以便shader中通過(guò)這個(gè)01空間的焦點(diǎn)距離與depth比較
????private?float?FocalDistance01(float?distance)
????{
????????return?MainCam.WorldToViewportPoint((distance?-?MainCam.nearClipPlane)?*?MainCam.transform.forward?+?MainCam.transform.position).z?/?(MainCam.farClipPlane?-?MainCam.nearClipPlane);
????}
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????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
評(píng)論
共有 條評(píng)論