How do you access to the RendererFeature instances set for each ScriptableRenderer?

There is UniversalAdditionalCameraData.scriptableRenderer, but there is no UniversalAdditionalCameraData.scriptableRendererData.

ScriptableRenderer and ScriptableRendererData are only linked with UniversalAdditionalCameraData.m_RendererIndex

However, there is no API to get UniversalAdditionalCameraData.m_RendererIndex, nor can ScriptableRendererData.m_RendererDataList be obtained by the public API.

How do you get to the RendererFeature instances set for each ScriptableRenderer?

It’s possible to get it with the function below, but I think it’s a brute way.

I want to get it with a public API.

ScriptableRendererData GetScriptableRendererData( Camera camera )
{
    int rendererIndex = 0;
    if (camera != null) {
        UniversalAdditionalCameraData cameraData = camera.GetUniversalAdditionalCameraData();
        FieldInfo rendererIndexInfo = cameraData.GetType().GetField("m_RendererIndex", BindingFlags.Instance | BindingFlags.NonPublic);
        rendererIndex = (int)(rendererIndexInfo?.GetValue(cameraData));
    }
    var pipeline = (UniversalRenderPipelineAsset)GraphicsSettings.renderPipelineAsset;
    FieldInfo propertyInfo = pipeline.GetType().GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic);

    return  ((ScriptableRendererData[])propertyInfo?.GetValue(pipeline))?[rendererIndex];
}

[FeatureRequest]
(for URP14.0.8)

Runtime\UniversalAdditionalCameraData.cs
//--------------------------------------------------------------------
// Get the renderer index set in the camera
//--------------------------------------------------------------------
public int GetRendererIndex()
{
        return m_RendererIndex;
}
-------------------------------------------------------------

Runtime\Data\UniversalRenderPipelineAsset.cs
//--------------------------------------------------------------------
// Specify the index of ScriptableRenderer set in UniversalRenderPipeline and get the corresponding ScriptableRendererData
//--------------------------------------------------------------------
public ScriptableRendererData GetScriptableRendererData(int index)
{
        if (index < 0 || index >= m_RendererDataList.Length)
        {
            return null;
        }
        return m_RendererDataList[index];
}

Using Sample code

T GetRendererFeature<T>( Camera camera , int targetRendererFeatureIndex)
{
    //Get the URP-ExtentionData of Camera
    UniversalAdditionalCameraData cameraData = camera.GetUniversalAdditionalCameraData();
    // Get RendererIndex set to Camera by Additional API
    int rendererIndex = cameraData.GetRendererIndex();
    // Get UniversalRenderPipelineAsset from Project Settings
    UniversalRenderPipelineAsset renderPipelineAsset = ((UniversalRenderPipelineAsset)GraphicsSettings.renderPipelineAsset);
    // Get ScriptableRendererData from renderPipelineAsset with RendererIndex of Camera by Additional API
    var scriptableRendererData = renderPipelineAsset.GetScriptableRendererData(rendererIndex);
    // Get array of RendererFeatures from scriptableRendererData
    var rendererFeatures = scriptableRendererData.rendererFeatures;
    // Get the target RendererFeature
    T targetRendererFeature = (T)rendererFeatures[targetRendererFeatureIndex];
    return targetRendererFeature;
}