溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用shader怎么實(shí)現(xiàn)屏幕高斯模糊

發(fā)布時(shí)間:2021-06-24 17:30:08 來源:億速云 閱讀:542 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI