https://www.cnblogs.com/hont/p/14221019.html
创建RenderFeature
绘制指定物体
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
CommandBuffer cmd = CommandBufferPool.Get("FogOfWar");
// Draw tag "FogOfWar" object
var desc = renderingData.cameraData.cameraTargetDescriptor;
int tmpRt = Shader.PropertyToID("_FogOfWarMaskTexture");
desc.height = desc.height >> m_DownSample;
desc.width = desc.width >> m_DownSample;
cmd.GetTemporaryRT(tmpRt, desc);
cmd.SetRenderTarget(tmpRt);
// Set camera whether clear mode
cmd.ClearRenderTarget(true, !m_IsDragShadow, Color.clear);
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
var drawSettings =
CreateDrawingSettings(m_ShaderTagId, ref renderingData, SortingCriteria.CommonOpaque);
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref m_FilteringSettings);
// Box Blur
if (this.m_Mat != null)
{
this.m_Mat.SetInt("_Width", this.m_Width);
this.m_Mat.SetFloat("_Scale", this.m_Scale);
cmd.Blit(m_TempTextureHandle.Identifier(), destination, this.m_Mat);
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
}
CommandBufferPool.Release(cmd);
}
需要指定rendertexture
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
if (!m_FogOfWarMaskTextureRT)
{
// 粒子colorRT 做降采样
m_FogOfWarMaskTextureRT = new RenderTexture(
cameraTextureDescriptor.width >> m_DownSample,
cameraTextureDescriptor.height >> m_DownSample, 0);
m_FogOfWarMaskTextureRT.Create();
m_FogOfWarMaskTextureRT.name = "_FogOfWarMaskTexture";
}
// 绘制目标
ConfigureTarget(m_FogOfWarMaskTextureRT);
//绘制外内容设置为灰,我们为了过滤精度问题将a通道设置为0在pass中使用
// ConfigureClear(ClearFlag.All, new Color(0f,0f,0f,1f));
}
注意shader内的采样方式
sampler_linear_repeat_FogOfWarMaskTexture
这种才会线性采样,否则的话是point采样
渲染闪烁问题
不要用cmd.blit 要用Blit() 函数
如
Blit(cmd, m_TempTextureHandle.id, m_FogOfWarMaskTextureHandle.id)
这个就相当于以前的Graphic.blit否则就会出现莫名的闪烁问题,猜测是没设置rendertarget的 原因
记得release相关的贴图
public override void OnCameraCleanup(CommandBuffer cmd)
{
// if (m_TempTextureHandle.id != -1)
// {
// cmd.ReleaseTemporaryRT(m_TempTextureHandle.id);
// }
//
// if (m_FogOfWarMaskTextureHandle.id != -1)
// {
// cmd.ReleaseTemporaryRT(m_FogOfWarMaskTextureHandle.id);
// }
}
不然会影响下一个gettemp