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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Unity3D URP中使用Render Feature实现后处理效果

發布時間:2024/3/24 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D URP中使用Render Feature实现后处理效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

unity urp 自帶了一個后處理組件Volume,提供了不少后處理效果:

除此之外,Render Feature 也可以實現類似的效果,并且自由度更高。
使用方式是,在RenderPiplineAsset 中的Renderer中新增Feature,下面舉例說明如何通過Feature增加一個KawaseBlur的后處理效果。
首先寫一個自定義的Feature腳本:

using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal;public class KawaseBlur : ScriptableRendererFeature {[System.Serializable]public class KawaseBlurSettings{public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingTransparents;public Material blurMaterial = null;[Range(2,15)]public int blurPasses = 2;[Range(1,4)]public int downsample = 1;public bool copyToFramebuffer = true;public string targetName = "_blurTexture";}public KawaseBlurSettings settings = new KawaseBlurSettings();class CustomRenderPass : ScriptableRenderPass{public Material blurMaterial;public int passes;public int downsample;public bool copyToFramebuffer;public string targetName; string profilerTag;int tmpId1;int tmpId2;RenderTargetIdentifier tmpRT1;RenderTargetIdentifier tmpRT2;RenderTargetIdentifier cameraColorTexture;public CustomRenderPass(string profilerTag){this.profilerTag = profilerTag;}public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor){var width = cameraTextureDescriptor.width / downsample;var height = cameraTextureDescriptor.height / downsample;tmpId1 = Shader.PropertyToID("tmpBlurRT1");tmpId2 = Shader.PropertyToID("tmpBlurRT2");cmd.GetTemporaryRT(tmpId1, width, height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);cmd.GetTemporaryRT(tmpId2, width, height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);tmpRT1 = new RenderTargetIdentifier(tmpId1);tmpRT2 = new RenderTargetIdentifier(tmpId2);ConfigureTarget(tmpRT1);ConfigureTarget(tmpRT2);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){cameraColorTexture = renderingData.cameraData.renderer.cameraColorTarget;CommandBuffer cmd = CommandBufferPool.Get(profilerTag);RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor;opaqueDesc.depthBufferBits = 0;// first pass// cmd.GetTemporaryRT(tmpId1, opaqueDesc, FilterMode.Bilinear);cmd.SetGlobalFloat("_offset", 1.5f);cmd.Blit(cameraColorTexture, tmpRT1, blurMaterial);for (var i=1; i<passes-1; i++) {cmd.SetGlobalFloat("_offset", 0.5f + i);cmd.Blit(tmpRT1, tmpRT2, blurMaterial);// pingpong(tmpRT1, tmpRT2) = (tmpRT2, tmpRT1);}// final passcmd.SetGlobalFloat("_offset", 0.5f + passes - 1f);if (copyToFramebuffer) {cmd.Blit(tmpRT1, cameraColorTexture, blurMaterial);} else {cmd.Blit(tmpRT1, tmpRT2, blurMaterial);cmd.SetGlobalTexture(targetName, tmpRT2);}context.ExecuteCommandBuffer(cmd);cmd.Clear();CommandBufferPool.Release(cmd);}public override void FrameCleanup(CommandBuffer cmd){}}CustomRenderPass scriptablePass;public override void Create(){scriptablePass = new CustomRenderPass("KawaseBlur");scriptablePass.blurMaterial = settings.blurMaterial;scriptablePass.passes = settings.blurPasses;scriptablePass.downsample = settings.downsample;scriptablePass.copyToFramebuffer = settings.copyToFramebuffer;scriptablePass.targetName = settings.targetName;scriptablePass.renderPassEvent = settings.renderPassEvent;}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){renderer.EnqueuePass(scriptablePass);} }

再加上一個Blur Shader:

Shader "Custom/RenderFeature/KawaseBlur" {Properties{_MainTex ("Texture", 2D) = "white" {}// _offset ("Offset", float) = 0.5}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;// sampler2D _CameraOpaqueTexture;float4 _MainTex_TexelSize;float4 _MainTex_ST;float _offset;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f input) : SV_Target{float2 res = _MainTex_TexelSize.xy;float i = _offset;fixed4 col; col.rgb = tex2D( _MainTex, input.uv ).rgb;col.rgb += tex2D( _MainTex, input.uv + float2( i, i ) * res ).rgb;col.rgb += tex2D( _MainTex, input.uv + float2( i, -i ) * res ).rgb;col.rgb += tex2D( _MainTex, input.uv + float2( -i, i ) * res ).rgb;col.rgb += tex2D( _MainTex, input.uv + float2( -i, -i ) * res ).rgb;col.rgb /= 5.0f;return col;}ENDCG}} }

其次新增一個Forward Render asset:

點擊Add Renderer Feature,把前面寫的自定義Blur添加進來,新建一個材質球,材質球使用上面寫的shader,并把材質球掛到 Feature 的Blur Material上,調整一下Blur Passes等參數,然后勾上Copy To Framebuffer。這樣我們的自定義 Forward Render 就做好了。
之后把自定義的 Forward Render 添加到當前使用的URP Render Pipeline Asset 上面:

注意如果點了Set Default,那么相機就會自動使用這個Feature,這里我們不把它當做默認,只是加上此Feature。然后在游戲中如果使用的是當前的 Render Pipeline Asset ,那么相機是可以選擇Renderer的,我們選上新增的自定義Renderer:

好了,此時當前相機渲染到FrameBuffer的圖像就會帶有Blur效果啦。另外,上面的Shader 也可以選擇將渲染出的圖片不輸出到 FrameBuffer 中,而是儲存在一個臨時Buffer中,供其他Shader使用。就是在Feature的參數中,不勾選 Copy to Framebuffer選項,并在Target Name中填上渲染的Buffer名字。像上圖中寫的 _blurTexture,這樣之后就可以在其他shader中直接使用_blurTexture啦,可以實現一些毛玻璃之類的效果,當然需要使用一個調整好視角的單獨相機,另外渲染時機(Render Pass Event)可能需要修改一下。使用Feature的好處是可以調整渲染時機,針對某幾個相機使用,并且可以挑選渲染對象(參考URP自帶的Feature:Render Objects),相對來說自由度更高。

總結

以上是生活随笔為你收集整理的Unity3D URP中使用Render Feature实现后处理效果的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 69网址| 一级毛片儿 | 国产一二三在线视频 | 男生尿隔着内裤呲出来视频 | www.男女| 91国产在线播放 | 国产一区二区四区 | 日本h在线| 黄色在线视频播放 | 春意影院福利社 | 浓精喷进老师黑色丝袜在线观看 | 国内精品久久久久久久久久 | 不卡av在线免费观看 | 精品无码久久久久成人漫画 | 国产精品99久久久精品无码 | 女生高潮视频在线观看 | avtt久久| 男人扒女人添高潮视频 | 国精产品一区一区三区在线 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 九一九色国产 | 无码人妻精品一区二区三 | 亚洲黄色a级片 | 午夜不卡av免费 | 国产精品午夜未成人免费观看 | 亚洲第一页视频 | 日韩欧美一区二区三区 | 福利一区二区在线观看 | 亚洲狠 | 国内激情自拍 | 精品人妻一区二区三区在线视频 | 久操视频精品 | 老司机精品福利视频 | 日本wwwxx| 亚洲天堂一区 | 一本久道视频一本久道 | jizz俄罗斯 | 午夜裸体性播放 | 国产av电影一区二区 | 国产欧美精品一区二区 | 狠狠操狠狠操 | 女生隐私免费看 | 无码人妻丰满熟妇啪啪欧美 | www.桃色| 免费黄色国产视频 | 亚洲午夜久久久久久久久久久 | 意大利少妇愉情理伦片 | 奇米狠狠干 | 欧美性白人极品1819hd | 国产欧美一区二区三区鸳鸯浴 | 欧美成人免费在线观看 | 玖玖玖精品 | 国产精品丝袜黑色高跟鞋 | 夜夜操夜夜爱 | 在线观看视频你懂得 | 操人视频在线观看 | 超碰青娱乐 | 无人在线观看高清视频 | 久久伊人精品 | 30一40一50女人毛片 | 国产一级二级av | 欧美日韩一卡二卡 | 色就是色网站 | 玉女心经在线看 | 麻豆久久久 | 精品久久人人 | 波多野结av衣东京热无码专区 | 成人欧美视频在线观看 | 国产亚洲午夜 | 欧美日韩国产亚洲一区 | 高清一区二区三区 | 水牛影视av一区二区免费 | 国产精品久久久久毛片大屁完整版 | 夜福利视频| 法国性xxxx精品hd | 在线播放国产精品 | 日韩成人福利 | 激情综合影院 | 亚洲AV无码成人精品国产一区 | 欧美另类极品videosbest使用方法 | 亚洲午夜无码av毛片久久 | 国产精品66 | 亚洲天堂美女 | www.三级 | 爆操女秘书| 五十路毛片 | 国产第一区第二区 | 女人囗交吞精囗述 | 直接看的毛片 | 天天操夜夜干 | 欧美激情第1页 | 日韩黄色网络 | 四虎av在线 | 中文字幕2区 | 亚洲色精品三区二区一区 | 欧美性受xxxx黑人xyx | 芒果视频污污 | 色综合久久综合 | 无遮挡aaaaa大片免费看 |