当前位置:网站首页>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是必须的
边栏推荐
- Get ready for the pre-season card game MotoGP ignition champions!
- Wechat official account web page authorization login is so simple
- Use JDBC technology and MySQL database management system to realize the function of course management, including adding, modifying, querying and deleting course information.
- [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
- [Jianzhi offer] 61 Shunzi in playing cards
- Cs231n notes (bottom) - applicable to 0 Foundation
- Three traversal methods of binary tree
- C# TCP如何限制单个客户端的访问流量
- Using C language to realize palindrome number
猜你喜欢

Copy mode DMA

Solution of vant tabbar blocking content
![[729. My Schedule i]](/img/e3/32914227d00cf7595ee850e60f2b72.png)
[729. My Schedule i]

【性能测试】jmeter+Grafana+influxdb部署实战

Jarvis OJ Flag

npm安装

激动人心!2022开放原子全球开源峰会报名火热开启!

Embedded UC (UNIX System Advanced Programming) -2

Jarvis OJ Webshell分析

Precision epidemic prevention has a "sharp weapon" | smart core helps digital sentinels escort the resumption of the city
随机推荐
【剑指 Offer】62. 圆圈中最后剩下的数字
什么是ROM
ECU introduction
Etcd 构建高可用Etcd集群
Using C language to realize palindrome number
Writing method of twig array merging
EasyX second lesson
【性能测试】全链路压测
【beanshell】数据写入本地多种方法
Application of threshold homomorphic encryption in privacy Computing: Interpretation
Sentinel flow guard
7.Scala类
Games101 notes (III)
Deep dive kotlin synergy (XXI): flow life cycle function
兰空图床苹果快捷指令
Jarvis OJ webshell analysis
调查显示传统数据安全工具面对勒索软件攻击的失败率高达 60%
Yarn common commands
Embedded-c Language-5
C how TCP restricts the access traffic of a single client