Hey! I customized a RenderFeature in Unity 2022.3! My requirement is to render a specific level of objects with a specific shader and set the result into a shader global texture! (This is a lot like a Render Object, but the difference is that it can’t render to a texture) Here’s my code and it doesn’t work!
public class Watersurface : ScriptableRendererFeature
{
[Serializable]
public class WaterSurfaceSettings
{
public RenderPassEvent passEvent = RenderPassEvent.AfterRenderingOpaques;
public LayerMask layerMask;
public Material OverrideMaterial;
}
public WaterSurfaceSettings settings = new WaterSurfaceSettings();
class WaterSurfaceRenderPass : ScriptableRenderPass
{
private const string RT = "_WaterSurface";
private static int WaterSurfaceID = Shader.PropertyToID("_WaterSurface");
static readonly List<ShaderTagId> ShaderTag = new List<ShaderTagId>();
private RTHandle waterSurface;
private int layerMask;
private Material OverrideMaterial;
public WaterSurfaceRenderPass (WaterSurfaceSettings settings)
{
renderPassEvent = settings.passEvent;
layerMask = settings.layerMask;
ShaderTag.Clear();
ShaderTag.Add(new ShaderTagId("UniversalForward"));
OverrideMaterial = settings.OverrideMaterial;
profilingSampler = new ProfilingSampler("WaterSurfaceRenderPass");
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
RenderTextureDescriptor desc = renderingData.cameraData.cameraTargetDescriptor;
desc.depthBufferBits = 0;
desc.width = (int)(desc.width * 0.8f);
desc.height = (int)(desc.height * 0.8f);
waterSurface = RTHandles.Alloc(desc, name: RT);
cmd.SetGlobalTexture(WaterSurfaceID,waterSurface);
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("DrawWaterSurface");
using (new ProfilingScope(cmd, profilingSampler))
{
cmd.SetRenderTarget(waterSurface.rt);
cmd.ClearRenderTarget(true,true,Color.clear);
var draw = CreateDrawingSettings(ShaderTag, ref renderingData,
renderingData.cameraData.defaultOpaqueSortFlags);
draw.overrideMaterial = OverrideMaterial;
FilteringSettings filtering = new FilteringSettings(RenderQueueRange.all, layerMask);
context.DrawRenderers(renderingData.cullResults, ref draw, ref filtering);
}
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
RTHandles.Release(waterSurface);
}
}
WaterSurfaceRenderPass underWaterRenderPass;
public override void Create()
{
underWaterRenderPass = new WaterSurfaceRenderPass(settings);
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
renderer.EnqueuePass(underWaterRenderPass);
}
}