47 lines
1.5 KiB
C#
47 lines
1.5 KiB
C#
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.Rendering;
|
|||
|
|
using UnityEngine.Rendering.Universal;
|
|||
|
|
|
|||
|
|
public class PixelateFeature : ScriptableRendererFeature
|
|||
|
|
{
|
|||
|
|
[System.Serializable]
|
|||
|
|
public class Settings
|
|||
|
|
{
|
|||
|
|
public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
|
|||
|
|
[Tooltip("用于像素化的材质")]
|
|||
|
|
public Material pixelateMaterial = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public Settings settings = new Settings();
|
|||
|
|
private PixelatePass m_PixelatePass;
|
|||
|
|
|
|||
|
|
// 当Feature被创建或Inspector中的值被改变时调用
|
|||
|
|
public override void Create()
|
|||
|
|
{
|
|||
|
|
// 检查材质是否存在
|
|||
|
|
if (settings.pixelateMaterial != null)
|
|||
|
|
{
|
|||
|
|
m_PixelatePass = new PixelatePass(settings.pixelateMaterial);
|
|||
|
|
// 将Inspector中设置的事件赋值给Pass
|
|||
|
|
m_PixelatePass.renderPassEvent = settings.renderPassEvent;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 如果材质为空,则不创建Pass,避免后续报错
|
|||
|
|
m_PixelatePass = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 【核心修正】这个方法现在非常干净,只负责将创建好的Pass入队
|
|||
|
|
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
|
|||
|
|
{
|
|||
|
|
if (m_PixelatePass == null)
|
|||
|
|
{
|
|||
|
|
// 如果Pass没有被成功创建(因为没材质),就直接返回
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 将我们的Pass添加到渲染队列中,URP会在正确的时间执行它
|
|||
|
|
renderer.EnqueuePass(m_PixelatePass);
|
|||
|
|
}
|
|||
|
|
}
|