代码之家  ›  专栏  ›  技术社区  ›  danglingPointer

如何在自定义过程中渲染基本的GameObject(Unity:ScriptableRenderPass)?

  •  0
  • danglingPointer  · 技术社区  · 2 年前

    我想做的事情: 在我的自定义过程中渲染特定层的游戏对象。我稍后想做更多的事情,但我只是想让它像URP一样渲染。

    我只是在学习ScriptableRenderPass/ScriptableRenderFeature,所以我开始学习基础。

    以下是我想要的:

    Expected

    以下是我得到的:

    Actual Result

    这就是我的传球执行的样子:

        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get("EnemyClearDepthPass"); // Take this outside if you don't need this to change at all.
    
            foreach (var renderer in _associatedObjects)
            {
                if (renderer.isVisible)
                {
                    cmd.DrawRenderer(renderer, renderer.sharedMaterial);
                }
            }
    
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
    

    看起来它的轮换(因此,它的MVP矩阵)是正确的。。。但它没有照明。我不知道第二个黑暗立方体是关于什么的。因此:

    选项#1) 弄清楚我需要向命令缓冲区传递哪些命令才能应用照明。。。并修复黑暗方块的任何内容。。。希望当我开始绘制更复杂的着色器时就是这样。

    但后来我有了一个想法:

    选项2) 也许我可以使用ScriptableRenderContext.DrawRenderers(…)来绘制它,因为我认为它会更“开箱即用”。

    以下是我得到的,无论我试图用这种方法做什么:

    Nothingness

    (我知道我本可以什么都不说……但是…)

    为了开始这种方法,我只是想传球,吸引一切。但我可以用它画任何东西。为什么?

    using System;
    using UnityEngine.Rendering;
    using UnityEngine.Rendering.Universal;
    public class JustDrawSomethingPls : ScriptableRendererFeature
    {
        // https://docs.unity3d.com/Packages/[email protected]/manual/containers/create-custom-renderer-feature-1.html
        class DrawEverythingPass : ScriptableRenderPass
        {
            public DrawEverythingPass() { }
    
            public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
            {
                CommandBuffer cmd = CommandBufferPool.Get("DrawEverythingPass");
                // https://docs.unity3d.com/ScriptReference/Rendering.DrawingSettings.html
                DrawingSettings drawingSettings = new DrawingSettings();
                drawingSettings.mainLightIndex = 0;
                    SortingSettings sortingSettings = new SortingSettings();
                    sortingSettings.criteria = SortingCriteria.None;
                drawingSettings.sortingSettings = sortingSettings;
                // https://docs.unity3d.com/ScriptReference/Rendering.FilteringSettings.html
                FilteringSettings filteringSettings = new FilteringSettings();
                filteringSettings.excludeMotionVectorObjects = false;
                filteringSettings.layerMask = int.MaxValue;
                filteringSettings.renderingLayerMask = uint.MaxValue;
                filteringSettings.renderQueueRange = new RenderQueueRange(0, 5000); // The upper bound must be at least 0 and at most 5000
                filteringSettings.sortingLayerRange = new SortingLayerRange(0, Int16.MaxValue);
                // https://docs.unity3d.com/ScriptReference/Rendering.RenderStateBlock.html
                RenderStateBlock renderStateBlock = new RenderStateBlock(RenderStateMask.Everything);
    
                context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, ref renderStateBlock);
    
                // Execute the command buffer
                context.ExecuteCommandBuffer(cmd);
                CommandBufferPool.Release(cmd);
            }
        }
    
        private DrawEverythingPass _drawEverythingPass;
        public override void Create()
        {
            _drawEverythingPass = new DrawEverythingPass();
        }
        public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
        {
            renderer.EnqueuePass(_drawEverythingPass);
        }
    }
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   danglingPointer    2 年前

    虽然我还没有通过命令缓冲区完全实现我想要做的事情,但重要的一步是不要使用

    cmd.DrawRenderer(renderer, renderer.sharedMaterial);
    

    因为它会将所有着色器过程绘制在彼此之上,而是使用特定的着色器过程(“ myShaderPass “):

    cmd.DrawRenderer(renderer, renderer.sharedMaterial, 0, myShaderPass);
    

    这篇文章的主要问题是,它在其他一切之上绘制了阴影通行证。请注意,让亮的着色器工作要比让未亮的着色器通过命令缓冲区工作要多得多。

    推荐文章