当前位置:网站首页>URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加
URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加
2022-07-05 16:37:00 【euphorias】
使用后处理进行一次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);
//核心命令CommandBuffer
cmd.Blit(tempTargetHandle.Identifier(), source); //相当于 Graphics.Blit
context.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);
//核心命令CommandBuffer
cmd.Blit(tempTargetHandle.Identifier(), source); //相当于 Graphics.Blit
context.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是必须的
边栏推荐
- Timestamp strtotime the day before or after the date
- Machine learning compilation lesson 2: tensor program abstraction
- Iphone14 with pill screen may trigger a rush for Chinese consumers
- Embedded UC (UNIX System Advanced Programming) -1
- Jarvis OJ 远程登录协议
- What is ROM
- thinkphp模板的使用
- [Web attack and Defense] WAF detection technology map
- Scratch colorful candied haws Electronic Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
- npm安装
猜你喜欢
Precision epidemic prevention has a "sharp weapon" | smart core helps digital sentinels escort the resumption of the city
浏览器渲染原理以及重排与重绘
Embedded UC (UNIX System Advanced Programming) -2
一个满分的项目文档是如何书写的|得物技术
[61dctf]fm
[Jianzhi offer] 63 Maximum profit of stock
腾讯音乐上线新产品“曲易买”,提供音乐商用版权授权
Benji Banas membership pass holders' second quarter reward activities update list
Deep dive kotlin synergy (XXI): flow life cycle function
Hiengine: comparable to the local cloud native memory database engine
随机推荐
张平安:加快云上数字创新,共建产业智慧生态
[Web attack and Defense] WAF detection technology map
精准防疫有“利器”| 芯讯通助力数字哨兵护航复市
阈值同态加密在隐私计算中的应用:解读
Apple has abandoned navigationview and used navigationstack and navigationsplitview to implement swiftui navigation
[first lecture on robot coordinate system]
How does the outer disk futures platform distinguish formal security?
Jarvis OJ 简单网管协议
Embedded UC (UNIX System Advanced Programming) -1
How to uninstall MySQL cleanly
【7.7直播预告】《SaaS云原生应用典型架构》大咖讲师教你轻松构建云原生SaaS化应用,难题一一击破,更有华为周边好礼等你领!
Is it safe for qiniu business school to open a stock account? Is it reliable?
Thoughtworks 全球CTO:按需求构建架构,过度工程只会“劳民伤财”
It is forbidden to copy content JS code on the website page
Copy mode DMA
NPM installation
composer安装报错:No composer.lock file present.
Wechat official account web page authorization login is so simple
【testlink】TestLink1.9.18常见问题解决方法
麻烦问下,DMS中使用Redis语法是以云数据库Redis社区版的命令为参考的嘛