参考教程: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示例相关推荐

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

    unity urp 自带了一个后处理组件Volume,提供了不少后处理效果: 除此之外,Render Feature 也可以实现类似的效果,并且自由度更高. 使用方式是,在RenderPiplineA ...

  2. Unity Render Streaming使用方法,WebRTC的基础搭建使用

    1.简介 Unity渲染流包含构建在Unity Render Streaming之上的公共 API 和项目示例.可以使用Unity Render Streaming包快速开发一个点对点的流媒体解决方案 ...

  3. Unity Render Streaming(亲测可用)

    1.简介 Unity渲染流包含构建在Unity Render Streaming之上的公共 API 和项目示例.可以使用Unity Render Streaming包快速开发一个点对点的流媒体解决方案 ...

  4. Unity Render Streaming 云渲染企业项目解决方案

    Unity Render Streaming 文章目录 Unity Render Streaming 前言 效果展示 打开场景 版本选择 Web服务器 1.Server下载,Node.js安装 2.S ...

  5. Unity Render Streaming 云渲染

    版本: Unity:2021.3.16f1 Unity Render Streaming:3.1.0-exp.5    (目前 .6 好像有些问题,我只好降到 .5 了) 创建项目 先搞这几个版本或者 ...

  6. URP - Render feature实现镜面反射

    1 前言 镜面反射(Planar reflection)是游戏中比较常用的效果,例如角色的展示界面的地面倒影,物体在水面的倒影,光滑的表面等. 1.1 利用反射摄像机实现镜面反射 在URP中常规的镜面 ...

  7. Unity Render Streaming 云渲染解决方案

    Render Streaming是Unity官方推出的一套云渲染解决方案,可以实现将我们打包的.exe程序运行于服务器云端,在浏览器.移动端进行显示,该解决方案基于Google开发的WebRTC流技术 ...

  8. Shader学习笔记(七)Unity Shader Rim示例

    轮廓高光效果 Unity官方高光示例 Shader "Example/Rim" {Properties {_MainTex ("Texture", 2D) = ...

  9. Unity Render Streaming,3D模型流式云渲染的解决方案

    Unity Render Streaming是Unity开源的一个高质量.高复杂的3D模型在云端渲染,手机端侧.浏览器显示的解决方案.此解决方案的流技术利用了WebRTC,开发人员甚至可以使用WebR ...

最新文章

  1. zxing 源码笔记
  2. Fisher 线性分类器--转
  3. 【Apache】 LXC 容器中重启 Apache 报错: Failed to set up mount namespacing: Permission denied
  4. STM32F7xx —— 输入
  5. C语言代码输出星期几,C语言程序设计: 输入年月日 然后输出是星期几
  6. 升级到AKU3.3 v1.1,感受智能手机的VGA模式
  7. centos7 最小化安装 无 ifconfig,netstat 的安装
  8. 当浙江“十万企业上云“遇见中国软件生态大会
  9. UVA10934 Dropping water balloons【DP】
  10. 数学建模matlab实验报告,数学建模实验.doc
  11. tarjan求桥、割顶
  12. Android教程 第四章 用户界面设计基础
  13. iOS应用支持IPV6,就那点事儿
  14. 计算机网络第五版笔记
  15. 软件技术专家能力模型
  16. H5纯静态页面分享到微信朋友圈带图片显示
  17. 【Python实用工具】速来!!一篇文章十分钟教你如何使用Python第三方库basemap进行地图绘制
  18. sorted()排序详解
  19. 中台为什么做不好?拆系统“烟囱”容易,拆思维“烟囱”难!
  20. anaconda3-2022.05 安装过程

热门文章

  1. 传奇列表放在服务器哪个文件夹,传奇服务端目录文件详细说明
  2. java descriptor_Descriptor
  3. 岁月划过生命线——大三上
  4. 简析USB-C反向手机电脑设备供电功能的原理
  5. Nmap端口扫描器使用笔记 补充中
  6. 小程序头像挂件-canvas生成图片
  7. 一些好项目以及背后的玩法
  8. VUE3+ThreeJs实现3D全景场景,可自由旋转视角
  9. Matlab遥感图像处理学习
  10. 2021年NFT艺术品不平凡的一年!!