日韩性视频-久久久蜜桃-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 | 欧美另类视频在线观看 | 国产亚洲一区二区在线 | av电影免费在线播放 | 天堂在线官网 | va在线| 黄色片免费网站 | 国产精品s色 | 成人免费看片网站 | 日韩一级片网址 | 日本成人在线网站 | 91色站| 欧美无玛 | 国产富婆一区二区三区 | 波多野结衣 一区 | 中文字幕亚洲在线 | 美女黄视频在线观看 | 亚洲另类色图 | av日韩中文字幕 | 国产日韩欧美在线观看视频 | 91九色在线播放 | 在线观看成年人视频 | 日韩无码精品一区二区三区 | 一本大道熟女人妻中文字幕在线 | 亚洲女人久久久 | 一区二区三区中文字幕在线观看 | 欧亚一区二区 | 亚州av| 天堂中文网| 中文久草| 久草免费在线观看视频 | 在线免费黄色网址 | av大帝| 欧美一区二区三区免费观看 | 天天干天天干天天操 | 国产高清av在线 | 超碰国产一区二区三区 | 欧美a级黄色片 | 亚洲精品丝袜 | 一个人看的视频www 色就是色网站 | 日韩成人激情视频 | 天堂在线免费观看 | 亚洲综合激情 | 超碰免费在线观看 | 精品人妻少妇一区二区 | 一级人爱视频 | 国产伦精品一区二区三区千人斩 | 一区在线不卡 | 欧美日韩一区二区三区不卡视频 | av大片在线| 日韩精品一区二区三 | 人妻少妇被猛烈进入中文字幕 | 日韩精品视频中文字幕 | 99九九精品视频 | 亚洲日日干 | 被灌满精子的波多野结衣 | 亚洲精品第五页 | 国产女人在线 | 香蕉视频在线免费看 | 97久久精品 | 国产白嫩美女无套久久 | a爱视频| 国产精品无码av在线播放 | 一级片在线视频 | 国产天堂久久 | 久久精品国产亚洲7777 | 最新网址av| 日韩高清专区 | 国产成a人亚洲精v品无码 | 天天躁夜夜躁 | 肥熟女一区二区三肥熟女 | 精品一二三区久久aaa片 | 免费在线日本 | 手机亚洲第一页 | 国产精品91在线观看 | 狠狠网站| 日韩熟妇一区二区三区 | 麻豆视频黄色 | 丰满大肥婆肥奶大屁股 | 久久一区二区视频 | 久久国色 | 在线免费观看高清视频 | 在线国产91| 亚洲资源站 | 女人舌吻男人茎视频 | 日批视频 | 69网站在线观看 | 精品无码一区二区三区 | 亚洲精品美女网站 | 精品国精品国产自在久不卡 | av中亚| 欧美有码在线观看 | 漂亮人妻被中出中文字幕 | 俄罗斯女人裸体性做爰 | 免费看毛片网站 | 光棍影院手机版在线观看免费 | 在线视频 日韩 | 黄色成人av |