Unity Render Feature示例
参考教程:Scriptable Render Feature
Unity 版本:2019.4
搭建URP场景
Render Feature作用是支持SRP扩展自定义渲染pass,因此需要在SRP下使用,这里选择URP,在package manager中找到Universal RP并install。
创建一个前向渲染管线资产,会生成一个UniversalRenderPipelineAsset和UniversalRenderPipelineAsset_Renderer文件。
在Edit-Project Settings-Graphics中将渲染管线设置为刚设置好的URP Asset
场景就自由发挥搭建吧
Render Feature脚本
MyBlitFeature.cs
using UnityEngine;
using UnityEngine.Rendering.Universal;public class MyBlitFeature : ScriptableRendererFeature
{[System.Serializable]public class MyFeatureSettings{// 在inspector面板中设置开关,插入pass的位置,材质public bool IsEnabled = true;public RenderPassEvent WhenToInsert = RenderPassEvent.AfterRendering;public Material MaterialToBlit;}// 命名为"settings" (小写) 才能在inspector面板中正确显示public MyFeatureSettings settings = new MyFeatureSettings();RenderTargetHandle renderTextureHandle;MyBlitRenderPass myRenderPass;// 创建pass,参数为pass名称、pass插入位置、渲染用到的材质public override void Create(){myRenderPass = new MyBlitRenderPass("My custom pass",settings.WhenToInsert,settings.MaterialToBlit);}// 每帧调用一次这个方法将自定义pass加入渲染管线中public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){if (!settings.IsEnabled){// 关闭则不添加return;}// 获取一些渲染所需信息,此处是摄像机的color buffervar cameraColorTargetIdent = renderer.cameraColorTarget;myRenderPass.Setup(cameraColorTargetIdent);// 添加pass.// Could queue up multiple passes and/or pick passes to userenderer.EnqueuePass(myRenderPass);}
}
MyBlitRenderPass.cs
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;class MyBlitRenderPass : ScriptableRenderPass
{// 用来在Frame Debug工具中标识pass名string profilerTag;Material materialToBlit;RenderTargetIdentifier cameraColorTargetIdent;RenderTargetHandle tempTexture;public MyBlitRenderPass(string profilerTag,RenderPassEvent renderPassEvent, Material materialToBlit){this.profilerTag = profilerTag;this.renderPassEvent = renderPassEvent;this.materialToBlit = materialToBlit;}// 用来被Feature类调用初始化一些需要的数据,例如本例中的相机Color bufferpublic void Setup(RenderTargetIdentifier cameraColorTargetIdent){this.cameraColorTargetIdent = cameraColorTargetIdent;}// 该方法每帧Execute方法执行前被调用, 用作渲染前准备工作public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor){// 使用相机渲染目标参数创建临时纹理cmd.GetTemporaryRT(tempTexture.id, cameraTextureDescriptor);}// 每帧每个符合条件的相机会执行一次,渲染发生时不会再调用。所以只能通过cmd执行渲染,不能在这里写渲染命令。// RenderingData(没有清晰的文档)提供了一系列场景还有被渲染的信息 provides a bunch of (not very well documented)public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){// 获取cmdCommandBuffer cmd = CommandBufferPool.Get(profilerTag);cmd.Clear();// 实际渲染pass// 将相机纹理通过材质生成到临时纹理中cmd.Blit(cameraColorTargetIdent, tempTexture.Identifier(), materialToBlit, 0);// 再将临时纹理内容复制回相机颜色缓冲中cmd.Blit(tempTexture.Identifier(), cameraColorTargetIdent);// 执行cmdcontext.ExecuteCommandBuffer(cmd);// 释放cmdcmd.Clear();CommandBufferPool.Release(cmd);}// Excute方法后执行,在这里释放Configure中分配的内存public override void FrameCleanup(CommandBuffer cmd){cmd.ReleaseTemporaryRT(tempTexture.id);}
}
创建材质
原文用Shader Graph创建的一个Invert shader我不知道为什么不行,有试过的朋友如果有同样问题最后解决了可以告诉我下为啥?
我换了个其他后处理shader,创建一个Material,使用这个shader
Shader "Custom/BrightnessSaturationAndContrast"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Brightness("Brightness", Float) = 1_Saturation("Saturation", Float) = 1_Contrast("_Contrast", Float) = 1}SubShader{// No culling or depthCull Off ZWrite Off ZTest AlwaysPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;half _Brightness;half _Saturation;half _Contrast;struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;};v2f vert (appdata_img v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;return o;}fixed4 frag (v2f i) : SV_Target{fixed4 renderTex = tex2D(_MainTex, i.uv);fixed3 finalColor = renderTex.rgb * _Brightness;fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;fixed3 luminanceColor = fixed3(luminance, luminance, luminance);finalColor = lerp(luminanceColor, finalColor, _Saturation);fixed avgColor = fixed3(0.5,0.5, 0.5);finalColor = lerp(avgColor, finalColor, _Contrast);return fixed4(finalColor, renderTex.a);}ENDCG}}
}
添加Render Feature
添加后效果如下,并在Material中设置刚加入好的材质
效果
最终调整材质球中的参数就可以看到屏幕中的变化。
Unity Render Feature示例相关推荐
- Unity3D URP中使用Render Feature实现后处理效果
unity urp 自带了一个后处理组件Volume,提供了不少后处理效果: 除此之外,Render Feature 也可以实现类似的效果,并且自由度更高. 使用方式是,在RenderPiplineA ...
- Unity Render Streaming使用方法,WebRTC的基础搭建使用
1.简介 Unity渲染流包含构建在Unity Render Streaming之上的公共 API 和项目示例.可以使用Unity Render Streaming包快速开发一个点对点的流媒体解决方案 ...
- Unity Render Streaming(亲测可用)
1.简介 Unity渲染流包含构建在Unity Render Streaming之上的公共 API 和项目示例.可以使用Unity Render Streaming包快速开发一个点对点的流媒体解决方案 ...
- Unity Render Streaming 云渲染企业项目解决方案
Unity Render Streaming 文章目录 Unity Render Streaming 前言 效果展示 打开场景 版本选择 Web服务器 1.Server下载,Node.js安装 2.S ...
- Unity Render Streaming 云渲染
版本: Unity:2021.3.16f1 Unity Render Streaming:3.1.0-exp.5 (目前 .6 好像有些问题,我只好降到 .5 了) 创建项目 先搞这几个版本或者 ...
- URP - Render feature实现镜面反射
1 前言 镜面反射(Planar reflection)是游戏中比较常用的效果,例如角色的展示界面的地面倒影,物体在水面的倒影,光滑的表面等. 1.1 利用反射摄像机实现镜面反射 在URP中常规的镜面 ...
- Unity Render Streaming 云渲染解决方案
Render Streaming是Unity官方推出的一套云渲染解决方案,可以实现将我们打包的.exe程序运行于服务器云端,在浏览器.移动端进行显示,该解决方案基于Google开发的WebRTC流技术 ...
- Shader学习笔记(七)Unity Shader Rim示例
轮廓高光效果 Unity官方高光示例 Shader "Example/Rim" {Properties {_MainTex ("Texture", 2D) = ...
- Unity Render Streaming,3D模型流式云渲染的解决方案
Unity Render Streaming是Unity开源的一个高质量.高复杂的3D模型在云端渲染,手机端侧.浏览器显示的解决方案.此解决方案的流技术利用了WebRTC,开发人员甚至可以使用WebR ...
最新文章
- zxing 源码笔记
- Fisher 线性分类器--转
- 【Apache】 LXC 容器中重启 Apache 报错: Failed to set up mount namespacing: Permission denied
- STM32F7xx —— 输入
- C语言代码输出星期几,C语言程序设计: 输入年月日 然后输出是星期几
- 升级到AKU3.3 v1.1,感受智能手机的VGA模式
- centos7 最小化安装 无 ifconfig,netstat 的安装
- 当浙江“十万企业上云“遇见中国软件生态大会
- UVA10934 Dropping water balloons【DP】
- 数学建模matlab实验报告,数学建模实验.doc
- tarjan求桥、割顶
- Android教程 第四章 用户界面设计基础
- iOS应用支持IPV6,就那点事儿
- 计算机网络第五版笔记
- 软件技术专家能力模型
- H5纯静态页面分享到微信朋友圈带图片显示
- 【Python实用工具】速来!!一篇文章十分钟教你如何使用Python第三方库basemap进行地图绘制
- sorted()排序详解
- 中台为什么做不好?拆系统“烟囱”容易,拆思维“烟囱”难!
- anaconda3-2022.05 安装过程