文章目录

  • URP 下取消勾选贴图SRGB,
  • 后处理脚本
  • 多重后处理问题
  • 效果对比
  • 完整参考代码

使用后处理进行一次GammaToLinner的转换,能达到正确效果

URP 下取消勾选贴图SRGB,


后处理脚本

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CameraFeature : ScriptableRendererFeature
{public Material Material; //UniversalRenderPipelineAsset_Renderer 面板,设置材质private MyVolumeFeaturePass myPass;public override void Create(){myPass = new MyVolumeFeaturePass();myPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){renderer.EnqueuePass(myPass);myPass.SetValue(renderer.cameraColorTarget, Material); //传递摄像机图像,和材质,给Pass 处理}public class MyVolumeFeaturePass : ScriptableRenderPass{// This method is called before executing the render pass.// It can be used to configure render targets and their clear state. Also to create temporary render target textures.// When empty this render pass will render to the active camera render target.// You should never call CommandBuffer.SetRenderTarget. Instead call <c>ConfigureTarget</c> and <c>ConfigureClear</c>.// The render pipeline will ensure target setup and clearing happens in a performant manner.public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){}private Material Material;//接受从Feature 面板设置的材质private RenderTargetIdentifier source;//接受相机图像public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//if (renderingData.cameraData.camera.name != "UIMainCamera")//{//    return;//}//执行后处理if (Material == null){return;}CommandBuffer cmd = CommandBufferPool.Get();//source  //源图像var dec = renderingData.cameraData.cameraTargetDescriptor; //目标图像RenderTargetHandle tempTargetHandle = new RenderTargetHandle();cmd.GetTemporaryRT(tempTargetHandle.id, dec);cmd.Blit(source, tempTargetHandle.Identifier(), Material);//核心命令CommandBuffercmd.Blit(tempTargetHandle.Identifier(), source); //相当于 Graphics.Blitcontext.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public void SetValue(RenderTargetIdentifier source, Material material){Material = material; //接受面板材质this.source = source;}}
}

多重后处理问题

因为没有指定UI相机,导致所有相机画面重复被转换,需要指定仅UI相机进行GammaToLinner转换(也可以在所有渲染之后对图像进行一次GammaToLinner转换)

在Execute函数中暴露相机名在面板上进行填写,判断是否是指定相机,不是指定相机,不进行后处理

         //判断是否是指定相机if (renderingData.cameraData.camera.name != cameraName){return;}

在Redner Feature 面板填入相机名

效果对比

完整参考代码

CameraFeature

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class CameraFeature : ScriptableRendererFeature
{public Material Material; //UniversalRenderPipelineAsset_Renderer 面板,设置材质private MyVolumeFeaturePass myPass;public string CameraName="";public override void Create(){myPass = new MyVolumeFeaturePass();myPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){renderer.EnqueuePass(myPass);myPass.SetValue(renderer.cameraColorTarget, Material, CameraName); //传递摄像机图像,和材质,给Pass 处理}public class MyVolumeFeaturePass : ScriptableRenderPass{// This method is called before executing the render pass.// It can be used to configure render targets and their clear state. Also to create temporary render target textures.// When empty this render pass will render to the active camera render target.// You should never call CommandBuffer.SetRenderTarget. Instead call <c>ConfigureTarget</c> and <c>ConfigureClear</c>.// The render pipeline will ensure target setup and clearing happens in a performant manner.public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){}private Material material;//接受从Feature 面板设置的材质private RenderTargetIdentifier source;//接受相机图像private string cameraName;public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){//判断是否是指定相机if (renderingData.cameraData.camera.name != cameraName){return;}//执行后处理if (material == null){return;}CommandBuffer cmd = CommandBufferPool.Get();//source  //源图像var dec = renderingData.cameraData.cameraTargetDescriptor; //目标图像RenderTargetHandle tempTargetHandle = new RenderTargetHandle();cmd.GetTemporaryRT(tempTargetHandle.id, dec);cmd.Blit(source, tempTargetHandle.Identifier(), material);//核心命令CommandBuffercmd.Blit(tempTargetHandle.Identifier(), source); //相当于 Graphics.Blitcontext.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public void SetValue(RenderTargetIdentifier source, Material material, string cameraName){this.material = material; //接受面板材质this.source = source;this.cameraName = cameraName;}}
}

PostGammaToLinner Shader

使用Amplify 连一个,其中_MainTex是必须的

URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加相关推荐

  1. URP下Alpha从Gamma空间到Linner空间转换(一)——Alpha贴图不叠加

    文章目录 问题描述 解决办法: 添加GammaToLinearSpace转换,添加三句 完整Shader: 问题描述 中间是默认的UI贴图,因为unity勾选SRBG,不处理Alpha通道,所以可能出 ...

  2. Linux下Shell脚本实战之监测磁盘空间

    Linux下Shell脚本实战之监测磁盘空间 一.脚本目的及要求 二.脚本内容 三.运行脚本 一.脚本目的及要求 (1) 监控/home下每各个用户目录的占用磁盘大小 (2) 监控/var/log下前 ...

  3. linux下qt静态编译_自由出土文物的空间_百度空间

    linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...

  4. 为什么程序下在其他盘,c盘空间还是增多了?appdata文件夹有什么用途?

    为什么程序下在其他盘,c盘空间还是增多了? 程序下载安装在其它盘,代表着程序的源代码和运行文件在其它盘,然而你要去调用它,Windows就会在Appdata下去生成这个程序的启动文件夹. 同时wind ...

  5. Unity的URP下使用SRPBatcher

    回到目录 大家好,我是阿赵.这里继续来讲一下URP相关的东西. 这次主要说的是SRP Batcher的使用 一.在URP下实现SRP Batcher 1.设置 在我们创建的URPAsset文件的高级选 ...

  6. Android开发之QQ空间效果(QQ空间下拉图片放大,松手后回弹)

    Android开发之QQ空间效果(QQ空间下拉图片放大,松手后回弹) 腾讯QQ空间的下拉图片放大,松手后回弹的效果带来的视觉差异效果让许多移动开发者心动不已,经本人一段时间的研究,终于实现了该视差效果 ...

  7. oracle 11g b表空间什么情况下自动增加,oracle 11g 查看表空间使用情况,表空间创建,表空间添加数据文件,修改数据文件自动增长,删除表空间...

    1.查看表空间以及表空间使用情况 SELECT TABLESPACE_NAME "表空间", To_char(Round(BYTES / 1024, 2), '99990.00') ...

  8. 使用c++检查Linux系统某目录下硬盘空间,如果空间少于200m时删除最老的文件

    可以使用 C 语言的 statvfs 函数来检查 Linux 系统中某个目录的硬盘空间.具体来说,首先你需要获取目录的文件系统信息,然后再计算出剩余空间. 如果空间不足 200 MB,可以使用 C 语 ...

  9. Unity的gamma矫正、颜色空间及其转换的问题

    Unity的gamma矫正.颜色空间及其转换的问题 1,伽马矫正 2,unity的颜色空间 2.1两种颜色空间流程 2.2pbr贴图格式 2.3手动完成空间切换 2.4升级URP后亮度不一致问题的问题 ...

最新文章

  1. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt
  2. 58 Openstack基础、openstack之glance、openstack之keystone
  3. DOTA2:IG实力不如Nigma?解说:错了,让门票给他们自己回家训练
  4. 广州.NET俱乐部 VSTS活动报道
  5. 【英语学习】【WOTD】farouche 释义/词源/示例
  6. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
  7. 一线城市的繁荣vs年轻人的梦想?
  8. 经典网络结构 (五):ResNet (残差网络)
  9. 产品经理必备原型工具Axure RP 8自定义元件库
  10. 苹果电脑python编译器_Mac版-python环境配置(二):编译器pycharm下载安装
  11. 用别人的githut账号在自己电脑上拉取代码问题
  12. 宽字符处理函数函数与普通函数对照表
  13. 饥荒联机版服务器控制台本地和在线,《饥荒》多人联机版控制台开启方法详解...
  14. DirectX11_HLSL入门篇
  15. 弃用手机号码未被解绑小米账户:用户信息遭泄露
  16. C# / VB 获取PDF文档的数字签名信息
  17. 时间字符串转Timestamp时间戳
  18. mysql基础篇笔记(黑马)
  19. 各种靠谱教程总结(后续更新)
  20. zzuli OJ 1086: ASCII码排序(多实例测试)

热门文章

  1. 2014_3_29_周赛 马腿上的最短路
  2. linux没有网卡驱动能pxe吗,PXE所需要的网卡驱动制作
  3. qt linux字体,Qt字体轮廓的绘制
  4. C++ 在字符串中获取身份证号
  5. 友善之臂 mini2440 linux led 驱动代码,友善之臂mini2440的LEDdriver驱动分析及测试程序...
  6. WinDbg 本地调试和远程调试相关内容
  7. 郝斌老师-C语言视频教程(全180讲)
  8. i++ 、 ++i和i+=1、i=i+1 的问题
  9. [渝粤教育] 西南科技大学 成本会计 在线考试复习资料
  10. plasma桌面特效无效的解决办法