今天就跟大家聊聊有關(guān)使用shader怎么實(shí)現(xiàn)屏幕高斯模糊,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
秦都ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
1.新建一個(gè)C#腳本,改腳本必須掛在攝像機(jī)上
using UnityEngine; using System.Collections; /// <summary> /// 高期模糊 /// </summary> public class GaussianBlur : PostEffectsBase { //調(diào)整高斯模糊迭代次數(shù) [Range(0, 4)] public int iterations = 3; //模糊范圍 [Range(0.2f, 3.0f)] public float blurSpread = 0.6f; //縮放系數(shù) //downSample越大,需要處理的像素越少,同時(shí)也能進(jìn)一步提高模糊程序, //但過大的downSample可能會使圖像像素化。 [Range(1, 8)] public int downSample = 2; public Shader gaussianBlurShader; private Material gaussianBlurMaterial = null; public Material material { get { gaussianBlurMaterial = CheckShaderAndCreateMaterial(gaussianBlurShader, gaussianBlurMaterial); return gaussianBlurMaterial; } } void OnRenderImage(RenderTexture src, RenderTexture dest) { if (material != null) { //利用縮放對圖像進(jìn)行降采樣,從而減少需要處理的像素個(gè)數(shù),提高性能。 int rtW = src.width / downSample; int rtH = src.height / downSample; //分配一塊緩沖區(qū),這是因?yàn)?,高斯模糊需要調(diào)用兩個(gè)Pass,我們需要使用一塊中間緩存來 //存儲第一個(gè)Pass執(zhí)行完畢后得到的模糊結(jié)果。 RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0); //將該臨時(shí)渲染紋理的濾波模式設(shè)置為雙線性。這樣,在調(diào)用第一個(gè)Pass時(shí),我們需要處理的 //像素個(gè)數(shù)就是原來的幾分之一。對圖像進(jìn)行降采樣不僅可以減少需要處理的像素個(gè)數(shù),提高性能, //而且適當(dāng)?shù)慕挡赏€可以得到更好的模糊效果。 buffer0.filterMode = FilterMode.Bilinear; Graphics.Blit(src, buffer0); //高斯模糊迭代次數(shù) for(int i=0; i<iterations; i++){ material.SetFloat("_BlurSize", 1.0f + i * blurSpread); RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0); //執(zhí)行第一個(gè)Pass Graphics.Blit(buffer0, buffer1, material, 0); RenderTexture.ReleaseTemporary(buffer0); buffer0 = buffer1; buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0); //執(zhí)行第二個(gè)Pass Graphics.Blit(buffer0, buffer1, material, 1); RenderTexture.ReleaseTemporary(buffer0); buffer0 = buffer1; } Graphics.Blit(buffer0, dest); //釋放臨時(shí)緩存 RenderTexture.ReleaseTemporary(buffer0); } else { Graphics.Blit(src, dest); } } }
2.新建一個(gè)頂點(diǎn)著色器的shader,實(shí)現(xiàn)高斯模糊的shader代碼如下:
using UnityEngine; using System.Collections; /// <summary> /// 高期模糊 /// </summary> public class GaussianBlur : PostEffectsBase { //調(diào)整高斯模糊迭代次數(shù) [Range(0, 4)] public int iterations = 3; //模糊范圍 [Range(0.2f, 3.0f)] public float blurSpread = 0.6f; //縮放系數(shù) //downSample越大,需要處理的像素越少,同時(shí)也能進(jìn)一步提高模糊程序, //但過大的downSample可能會使圖像像素化。 [Range(1, 8)] public int downSample = 2; public Shader gaussianBlurShader; private Material gaussianBlurMaterial = null; public Material material { get { gaussianBlurMaterial = CheckShaderAndCreateMaterial(gaussianBlurShader, gaussianBlurMaterial); return gaussianBlurMaterial; } } void OnRenderImage(RenderTexture src, RenderTexture dest) { if (material != null) { //利用縮放對圖像進(jìn)行降采樣,從而減少需要處理的像素個(gè)數(shù),提高性能。 int rtW = src.width / downSample; int rtH = src.height / downSample; //分配一塊緩沖區(qū),這是因?yàn)椋咚鼓:枰{(diào)用兩個(gè)Pass,我們需要使用一塊中間緩存來 //存儲第一個(gè)Pass執(zhí)行完畢后得到的模糊結(jié)果。 RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0); //將該臨時(shí)渲染紋理的濾波模式設(shè)置為雙線性。這樣,在調(diào)用第一個(gè)Pass時(shí),我們需要處理的 //像素個(gè)數(shù)就是原來的幾分之一。對圖像進(jìn)行降采樣不僅可以減少需要處理的像素個(gè)數(shù),提高性能, //而且適當(dāng)?shù)慕挡赏€可以得到更好的模糊效果。 buffer0.filterMode = FilterMode.Bilinear; Graphics.Blit(src, buffer0); //高斯模糊迭代次數(shù) for(int i=0; i<iterations; i++){ material.SetFloat("_BlurSize", 1.0f + i * blurSpread); RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0); //執(zhí)行第一個(gè)Pass Graphics.Blit(buffer0, buffer1, material, 0); RenderTexture.ReleaseTemporary(buffer0); buffer0 = buffer1; buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0); //執(zhí)行第二個(gè)Pass Graphics.Blit(buffer0, buffer1, material, 1); RenderTexture.ReleaseTemporary(buffer0); buffer0 = buffer1; } Graphics.Blit(buffer0, dest); //釋放臨時(shí)緩存 RenderTexture.ReleaseTemporary(buffer0); } else { Graphics.Blit(src, dest); } } }
看完上述內(nèi)容,你們對使用shader怎么實(shí)現(xiàn)屏幕高斯模糊有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
分享名稱:使用shader怎么實(shí)現(xiàn)屏幕高斯模糊
分享網(wǎng)址:http://sd-ha.com/article48/iedhep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、小程序開發(fā)、建站公司、網(wǎng)站策劃、品牌網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)