首页 > 其他分享 >Unity URP管线如何实现屏幕后处理

Unity URP管线如何实现屏幕后处理

时间:2023-01-07 11:12:43浏览次数:59  
标签:PostProcessDemo MainTex Settings Color cmd 后处理 Unity URP public

URP管线可扩展的自己的 RendererFeature,这里写了一个屏幕后处理的demo,首先shader如下:

 1 Shader "MyURP/Kerry/PostProcess/URPFeature_PostProcessDemo"
 2 {
 3     Properties
 4     {
 5         _MainTex("Main Texture", 2D) = "white" {}
 6         _Color("test", Color) = (1,1,1,1)
 7     }
 8 
 9     SubShader
10     {
11         Tags
12         {
13             "RenderType" = "Opaque"
14             "RenderPipeline" = "UniversalPipeline"
15         }
16 
17         Pass
18         {
19             Cull Off
20             ZWrite Off
21             ZTest Always
22 
23             HLSLPROGRAM
24             #pragma vertex vert
25             #pragma fragment frag
26             #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
27 
28             TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
29             half4 _Color;
30 
31             struct appdata
32             {
33                 float4 vertex : POSITION;
34                 float2 uv : TEXCOORD0;
35             };
36 
37             struct v2f
38             {
39                 float4 pos : SV_POSITION;
40                 float2 uv : TEXCOORD0;
41             };
42 
43             v2f vert(appdata v)
44             {
45                 v2f o;
46                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
47                 o.uv = v.uv;
48                 return o;
49             }
50 
51             half4 frag(v2f i) : SV_TARGET
52             {
53                 return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv) * _Color;
54             }
55 
56             ENDHLSL
57         }
58     }
59 
60     FallBack "Hidden/Universal Render Pipeline/FallbackError"
61 }

可以看到,这里就是输入一个颜色并叠加到屏幕颜色上。

C# RenderFeature代码如下:

 1 using System;
 2 using UnityEngine;
 3 using UnityEngine.Rendering;
 4 using UnityEngine.Rendering.Universal;
 5 
 6 public class URPFeature_PostProcessDemo : ScriptableRendererFeature
 7 {
 8     class URPPass_PostProcessDemo : ScriptableRenderPass
 9     {
10         Settings m_Settings;
11         RenderTargetIdentifier m_source;
12         RenderTargetIdentifier m_dest;
13 
14         public URPPass_PostProcessDemo(Settings settings)
15         {
16             m_Settings = settings;
17         }
18 
19         public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
20         {
21             m_source = renderingData.cameraData.renderer.cameraColorTarget;
22 
23             int tempRTName = Shader.PropertyToID("URPFeature_PostProcessDemo_TempRT");
24             cmd.GetTemporaryRT(tempRTName, renderingData.cameraData.cameraTargetDescriptor);
25             m_dest = new RenderTargetIdentifier(tempRTName);
26         }
27 
28         public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
29         {
30             m_Settings.m_mat.SetColor("_Color", m_Settings.m_Color);
31 
32             CommandBuffer cmd = CommandBufferPool.Get("URPFeature_PostProcessDemo_cmd");
33             Blit(cmd, m_source, m_dest, m_Settings.m_mat, 0);
34             Blit(cmd, m_dest, m_source);
35             context.ExecuteCommandBuffer(cmd);
36             CommandBufferPool.Release(cmd);
37         }
38     }
39 
40     [Serializable]
41     public class Settings
42     {
43         public Material m_mat;
44         public Color m_Color = Color.white;
45     }
46 
47     [SerializeField]
48     Settings m_Settings;
49     URPPass_PostProcessDemo m_pass;
50 
51 
52     public override void Create()
53     {
54         m_pass = new URPPass_PostProcessDemo(m_Settings);
55     }
56 
57     public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
58     {
59         if (m_Settings.m_mat)
60         {
61             renderer.EnqueuePass(m_pass);
62         }
63     }
64 
65 
66 }

 

最后,我们把这个feature加到URP管线中,如下:

 

 调整颜色值,发现屏幕颜色发生了改变:

 

 

 

 转载请注明出处:https://www.cnblogs.com/jietian331/p/17032259.html

标签:PostProcessDemo,MainTex,Settings,Color,cmd,后处理,Unity,URP,public
From: https://www.cnblogs.com/jietian331/p/17032259.html

相关文章

  • Unity URP Shader之如何获取屏幕坐标
    获取屏幕坐标,可使用Unity提供的内置函数float4ComputeScreenPos(float4positionCS);来获取,该方法定义如下:float4ComputeScreenPos(float4positionCS){float......
  • 【ABAQUS后处理】打印视口到文件
    abaquscae允许您在画布上打印一个或多个视口的快照,并将图像直接发送到打印机或文件以供以后使用,例如包含在嵌入打印报告的演示文稿中或以html格式显示document打印的......
  • Burpsuite使用教程三
    之前我们介绍了burpsuite的proxy使用方法,今天咱们再来学习一下如何使用proxy拦截手机流量。​首先进入到burpsuite界面里​找到设置,修改一下拦截设置​点击edit​默认是loop......
  • Unity URP Shader之各向异性头发高光之KK高光模型
    首先声明以下素材和shader代码都来自Kerry佬,我只做整理和学习之用,写此随笔是为了做个笔记方便以后查阅。 关于各向异性头发高光,效果可参考:  首先弄清以下知识点:1.......
  • Unity中使用GameObject.Find、Transform.Find查找GameObject
    ​GameObjectFindTransformFind查找游戏对象​​​前置条件​​​相关API​​​1GameObjectFind​​​​2TransformFind​​​​3其他查找​​​​实际测试​​​​即使......
  • [unity 2022 2d] unity项目的导入(三)
       创建这些文件夹接下来通过资源管理器打开该项目并进入art   创建以下六个文件夹  进入adventure同时另开一个之前下载的压缩包窗口 以资源管理......
  • Unity(支持WebGL)+PHP(Workerman的Gateway)用Websocket协议实现匹配对战(摇骰子为例)1
    目录服务端PHP(Windows下演示)安装PHP启动服务器结束服务器客户端Unity(版本Unity2021.3.5f1)1.发布Windows客户端ws/wss(不发布小游戏,请忽略此点)演示工程地址扩展发布其他......
  • [unity 2022 2d]项目创建,素材下载和软件初始化(二)
    一、项目创建        选择新建项目        2D和2D(URP)主要区别在于渲染模式的不同,选哪个都行。 ......
  • Unity 模型合并时纹理有缝隙的问题
    解决方式一:加载模型时,将纹理贴图的WrapMode设置为Clamp,FilterMode设置为Point解决方案二:模型合并时将UV往里缩几个像素,产生缝隙的原因是,纹理贴图做了线性插值这是Filter......
  • burpsuite使用教程(二)
    之前介绍过burpsuite的各个模块​今天具体的来讲解一下proxy这个模块​Proxy——是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,......