日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity Shader 屏幕后效果——Bloom外发光

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity Shader 屏幕后效果——Bloom外发光 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Bloom的原理很簡單,主要是提取渲染圖像中的亮部區域,并對亮部區域進行模糊處理,再與原始圖像混合而成。

?

一般對亮部進行模糊處理的部分采用高斯模糊,關于高斯模糊,詳見之前的另一篇博客:

https://www.cnblogs.com/koshio0219/p/11152534.html

?

計算方法:

總共需要用到4個Pass,它們的順序如下:

Pass 1:得到紋理的亮度值(灰度值),由此計算出亮部區域,傳遞給一個臨時的新紋理,這里叫_Bloom

Pass 2,3:單獨對_Bloom進行高斯模糊(縱橫),_Bloom紋理更新

Pass 4:混合原始紋理和_Bloom紋理,得到最終效果

?

為了得到更為細致的Bloom效果,建議將游戲的顏色空間由默認的伽馬空間轉為線性空間,必要時還可開啟HDR

?

控制腳本:

1 using UnityEngine; 2 3 public class BloomCtrl : ScreenEffectBase 4 { 5 private const string _LuminanceThreshold = "_LuminanceThreshold"; 6 private const string _BlurSize = "_BlurSize"; 7 private const string _Bloom = "_Bloom"; 8 9 [Range(0, 4)] 10 public int iterations = 3; 11 [Range(0.2f, 3.0f)] 12 public float blurSize = 0.6f; 13 [Range(1, 8)] 14 public int dowmSample = 2; 15 [Range(0.0f, 4.0f)] 16 public float luminanceThreshold = 0.6f;//控制Bloom效果的亮度閾值,因為亮度值大多數時不大于1,故該值超過1時一般無效果,但開啟HDR后圖像的亮度取值范圍將擴大 17 18 private void OnRenderImage(RenderTexture source, RenderTexture destination) 19 { 20 if (Material != null) 21 { 22 Material.SetFloat(_LuminanceThreshold, luminanceThreshold); 23 24 int rth = source.height / dowmSample; 25 int rtw = source.width / dowmSample; 26 27 RenderTexture buffer0 = RenderTexture.GetTemporary(rtw, rth, 0); 28 buffer0.filterMode = FilterMode.Bilinear; 29 30 //第1個Pass中提取紋理亮部,存到buffer0中,以便后面進行高斯模糊處理 31 Graphics.Blit(source, buffer0,Material,0); 32 33 for(int i = 0; i < iterations; i++) 34 { 35 Material.SetFloat(_BlurSize, blurSize*i+1.0f); 36 37 //第2,3個Pass中對亮部分別進行縱向和橫向的渲染處理(高斯模糊) 38 RenderTexture buffer1 = RenderTexture.GetTemporary(rtw, rth, 0); 39 Graphics.Blit(buffer0, buffer1, Material,1); 40 RenderTexture.ReleaseTemporary(buffer0);//臨時創建的渲染紋理不能直接釋放 x: buffer0.Release(); 41 42 buffer0 = RenderTexture.GetTemporary(rtw, rth, 0); 43 Graphics.Blit(buffer1, buffer0, Material, 2); 44 RenderTexture.ReleaseTemporary(buffer1); 45 } 46 47 //第4個Pass將buffer0高斯模糊后的結果傳給_Bloom以進行最后的混合 48 Material.SetTexture(_Bloom, buffer0); 49 Graphics.Blit(source,destination,Material,3);//注意這里用原始紋理作為源紋理而不是buffer0,因為buffer0已經作為另一個參數進行了傳遞,而這里還需要原始的紋理以進行混合 50 RenderTexture.ReleaseTemporary(buffer0); 51 } 52 else 53 Graphics.Blit(source, destination); 54 } 55 }

基類腳本見:

https://www.cnblogs.com/koshio0219/p/11131619.html

?

Shader腳本:

1 Shader "MyUnlit/Bloom" 2 { 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 _Bloom("Bloom",2D)="black"{} 7 _LuminanceThreshold("Luminance Threshold",Float)=0.5 8 _BlurSize("Blur Size",Float)=1.0 9 } 10 SubShader 11 { 12 CGINCLUDE 13 14 #include "UnityCG.cginc" 15 16 sampler2D _MainTex; 17 half4 _MainTex_TexelSize; 18 sampler2D _Bloom; 19 float _LuminanceThreshold; 20 float _BlurSize; 21 22 struct v2f 23 { 24 half2 uv : TEXCOORD0; 25 float4 pos : SV_POSITION; 26 }; 27 28 struct v2fBloom 29 { 30 //half4是因為這里還要存儲_Bloom紋理 31 half4 uv:TEXCOORD0; 32 float4 pos:SV_POSITION; 33 }; 34 35 v2f vert(appdata_img v) 36 { 37 v2f o; 38 o.pos=UnityObjectToClipPos(v.vertex); 39 o.uv=v.texcoord; 40 return o; 41 } 42 43 v2fBloom vertBloom(appdata_img v) 44 { 45 v2fBloom o; 46 o.pos=UnityObjectToClipPos(v.vertex); 47 48 //xy存儲主紋理,zw存儲_Bloom紋理,這樣不必再申請額外空間 49 o.uv.xy=v.texcoord; 50 o.uv.zw=v.texcoord; 51 52 //紋理坐標平臺差異化判斷,主要針對DirectX,因為DirectX與OpenGL紋理坐標原點不同(分別在左上和左下) 53 //同時Unity平臺對于主紋理已經進行過內部處理,因此這里只需要對_Bloom紋理進行平臺檢測和翻轉 54 //主要表現為進行y軸方向的翻轉(因為y軸方向相反),對于_Bloom紋理來說也就是w 55 #if UNITY_UV_STARTS_AT_TOP 56 if(_MainTex_TexelSize.y<0){ 57 o.uv.w=1.0-o.uv.w; 58 } 59 #endif 60 61 return o; 62 } 63 64 //提取超過亮度閾值的圖像 65 fixed4 fragExtractBright(v2f i):SV_Target 66 { 67 fixed4 col=tex2D(_MainTex,i.uv); 68 fixed val=clamp(Luminance(col)-_LuminanceThreshold,0.0,1.0); 69 return col*val; 70 } 71 72 //對xy和zw對應的紋理采樣進行混合 73 fixed4 fragBloom(v2fBloom i):SV_Target 74 { 75 return tex2D(_MainTex,i.uv.xy)+tex2D(_Bloom,i.uv.zw); 76 } 77 78 ENDCG 79 80 ZTest Always 81 Cull Off 82 ZWrite Off 83 84 //Pass 1:提亮部 85 Pass 86 { 87 CGPROGRAM 88 #pragma vertex vert 89 #pragma fragment fragExtractBright 90 ENDCG 91 } 92 93 //Pass 2,3:高斯模糊,這里直接調用以前寫的Pass 94 UsePass "MyUnlit/GaussianBlur/GAUSSIANBLUR_V" 95 96 UsePass "MyUnlit/GaussianBlur/GAUSSIANBLUR_H" 97 98 //Pass 4:混合原圖和模糊后亮部 99 Pass 100 { 101 CGPROGRAM 102 #pragma vertex vertBloom 103 #pragma fragment fragBloom 104 ENDCG 105 } 106 } 107 Fallback Off 108 }

?

效果如下:

?

轉載于:https://www.cnblogs.com/koshio0219/p/11169122.html

總結

以上是生活随笔為你收集整理的Unity Shader 屏幕后效果——Bloom外发光的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品视频不卡 | 国产毛片电影 | 色噜噜日韩精品欧美一区二区 | 国产视频一区二区在线 | 亚色91 | 国产精品不卡在线 | 美日韩黄色片 | www色视频| 粗大的内捧猛烈进出在线视频 | 久热伊人 | 黄色网在线 | 日本aⅴ在线观看 | 欧美日本色 | www.激情五月.com | 国产午夜成人久久无码一区二区 | 亚洲乱乱 | 麻豆理论片 | 另类性姿势bbwbbw | 夜夜天堂 | 亚洲一级成人 | 亚洲精品午夜精品 | www日韩在线观看 | 中国一级特黄毛片 | 国产亚洲精品精品国产亚洲综合 | av的天堂 | 成人黄色片免费看 | 亚洲精品乱码久久久久 | 人人草人人搞 | 天天干天天操天天舔 | 日本久色| 亚洲欧美一区二区三区孕妇 | 亚洲欧美日韩综合一区二区 | 亚洲精品社区 | 国产一线二线三线女 | 在线观看精品 | 丰满人妻一区二区三区免费 | 美女隐私免费网站 | 亚洲一级特黄 | 亚洲一区电影网 | 日韩欧美一区二区三区在线观看 | 99热这里只有精品在线 | 欧美在线综合 | 欧美jizz19性欧美 | a级片在线视频 | 日日爽夜夜操 | 欧美久久久久久久久久久久 | 成人小网站 | 一区二区三区欧美日韩 | ass精品国模裸体pics | 尤物综合网| 国产婷婷色综合av蜜臀av | 亚洲国产精品福利 | 午夜777 | 亚洲无码精品国产 | 久久久亚洲一区二区三区 | 日本在线免费 | 激情男女视频 | 成人黄色在线看 | 综合网五月 | 麻豆资源 | 国产无遮挡18禁无码网站不卡 | 国产三级国产精品 | 少妇乱淫36部 | 国内精品久久久久久 | 男男大尺度 | av第下页| 九九九九久久久久 | 日韩一级特黄 | 性欧美一区 | 精品无码国产一区二区三区av | 国产污污网站 | 天堂精品一区 | 亚洲第一精品在线 | 精品无码久久久久久久久 | 制服丝袜中文字幕在线 | www.av72| 色妞色视频一区二区三区四区 | 欧美人与性动交ccoo | 激情四射网 | 久久久久久久 | 欧美三级不卡 | 成人在线黄色 | 日韩无砖 | 一级性生活毛片 | 丁香婷婷在线 | 91精品国产91久久久久久吃药 | 精品久久无码视频 | 色爱av | 日本欧美一区 | 亚洲激情自拍 | 一区二区三区在线播放视频 | 在线免费观看视频你懂的 | 五月婷婷婷婷 | 欧洲视频一区二区三区 | 日本高清免费不卡视频 | 久久高清精品 | babes性欧美69| 亚洲色视频 | 色女人综合 |