您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)使用shader怎么實(shí)現(xiàn)屏幕高斯模糊,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
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可能會(huì)使圖像像素化。 [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,我們需要使用一塊中間緩存來 //存儲(chǔ)第一個(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可能會(huì)使圖像像素化。 [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,我們需要使用一塊中間緩存來 //存儲(chǔ)第一個(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)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。