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;
}