Ajoutez les paramètres de post-traitement au volume. Si le post-traitement n'a pas besoin d'être contrôlé dynamiquement via le volume, il n'est pas nécessaire de l'utiliser.
Code de référence et commentaires :
Parmi eux, MaterialParameter est un type de matériau qui n'est pas fourni avec Volume. Vous devez encapsuler manuellement le type de paramètre qui n'existe pas.
using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class MyVolume : VolumeComponent, IPostProcessComponent
{
//需要封装参数
public MaterialParameter Material = new MaterialParameter(null, false);
//需要封装参数
public ColorParameter BlendColor = new ColorParameter(Color.white);
public bool IsActive()
{
if (Material.overrideState == false)//如果材质没有被勾选,则不激活
{
return false;
}
return true;
}
public bool IsTileCompatible()
{
return true;
}
}
[Serializable]
public sealed class MaterialParameter : VolumeParameter<Material>
{
//没有自带的Material 封装,手动封装参数
public MaterialParameter(Material value, bool overrideState = false)
: base(value, overrideState)
{
}
}
MaterialParameter est modifié. Il n'est pas nécessaire d'obtenir les paramètres à partir du panneau Render Feature. Au lieu de cela, ils sont obtenus à partir de VolumeManager.
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class MyVolumeFeature : ScriptableRendererFeature
{
public Material Material; //UniversalRenderPipelineAsset_Renderer 面板,设置材质
public Color BlendColor;
private MyVolumeFeaturePass myPass;
public override void Create()
{
myPass = new MyVolumeFeaturePass();
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(myPass);
myPass.SetValue(renderer.cameraColorTarget, Material,BlendColor); //传递给Pass 处理
}
}
public class MyVolumeFeaturePass : ScriptableRenderPass
{
private Material Material;
private RenderTargetIdentifier source;
private Color color;//接受面板颜色
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
MyVolume Volume = VolumeManager.instance.stack.GetComponent<MyVolume>();
if (!Volume.IsActive())//没激活Volume 则不后处理
{
return;
}
//执行后处理
//设置要混合的材质参数,从Volume 获取
Material = Volume.Material.value;
Material.SetColor("_Color",Volume.BlendColor.value);
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, Color blendColor)
{
Material = material; //接受面板材质
this.source = source;
color = blendColor;
}
}
Effet final : superposé au volume intégré
L'interface utilisateur n'est pas post-traitée par MyVolume car le timing de post-traitement n'est pas défini.
myPass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;