RenderFeature绘制指定物体

35 篇文章 4 订阅

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值