Search Unity

When drawing each gameobject, it seems that they ignore ambient / skybox color..

Discussion in 'Universal Render Pipeline' started by ggzerosum, Jun 20, 2021.

  1. ggzerosum

    ggzerosum

    Joined:
    Sep 26, 2017
    Posts:
    33
    :(
    When i draw MeshRenderer with my custom pass, it's likely to ignore ambient & skybox color.
    Two case below shows what i mean!

    First case, using unity skybox and ambient color
    upload_2021-6-20_15-12-47.png
    Scene settings
    upload_2021-6-20_15-13-6.png


    Second case, skybox and ambient color disabled
    upload_2021-6-20_15-13-25.png
    Scene settings
    upload_2021-6-20_15-13-33.png


    Here is my custom pass
    Code (CSharp):
    1.  
    2. public class LayeredRenderingPass : ScriptableRenderPass
    3. {
    4.     private LayerMask _layerMask;
    5.     private LayerableTargetTable _table;
    6.     private RenderingLayer[] _cache = new RenderingLayer[10000];
    7.  
    8.     private const string ShaderPassName_ForwardLit = "ForwardLit";
    9.  
    10.     public LayeredRenderingPass(RenderPassEvent renderPassEvent, LayerMask layerMask, LayerableTargetTable table)
    11.     {
    12.         this.renderPassEvent = renderPassEvent;
    13.  
    14.         _layerMask = layerMask;
    15.         _table = table;
    16.     }
    17.  
    18.     public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
    19.     {
    20.         CommandBuffer cmdBuffer = CommandBufferPool.Get("LayeredRenderingBuffer");
    21.         context.ExecuteCommandBuffer(cmdBuffer);
    22.         cmdBuffer.Clear();
    23.  
    24.         if (_table != null)
    25.         {
    26.             int count = _table.QueryNonAlloc(ref _cache, Filter);
    27.             for (int i = 0; i < count; i++)
    28.             {
    29.                 RenderingLayer layer = _cache[i];
    30.  
    31.                 MeshRenderer renderer = layer.TargetRenderer;
    32.                 MeshFilter meshFilter = renderer.GetComponent<MeshFilter>();
    33.                 int subMeshCount = meshFilter.sharedMesh.subMeshCount;
    34.                 int lastSubMeshIndex = renderer.subMeshStartIndex + subMeshCount;
    35.  
    36.                 for (int subMeshIndex = renderer.subMeshStartIndex; subMeshIndex < lastSubMeshIndex; subMeshIndex++)
    37.                 {
    38.                     Material mtr = renderer.sharedMaterials[subMeshIndex];
    39.                     if (mtr != null)
    40.                     {
    41.                         int passIndex = mtr.FindPass(ShaderPassName_ForwardLit);
    42.                         cmdBuffer.DrawRenderer(renderer, renderer.sharedMaterials[subMeshIndex], subMeshIndex, passIndex);
    43.                     }
    44.                 }
    45.             }
    46.         }
    47.  
    48.         context.ExecuteCommandBuffer(cmdBuffer);
    49.         CommandBufferPool.Release(cmdBuffer);
    50.     }
    51.  
    52.     private bool Filter(RenderingLayer renderingLayer)
    53.     {
    54.         return ((1 << renderingLayer.gameObject.layer) & _layerMask.value) != 0;
    55.     }
    56. }
    I don't know how to render objects correctly....
    Please help me