feat(srp): add camera-driven universal renderer selection

This commit is contained in:
2026-04-21 00:53:35 +08:00
parent a6f7530855
commit e123e584c8
17 changed files with 391 additions and 7 deletions

View File

@@ -0,0 +1,124 @@
# SRP Universal Renderer Selection 主链计划 2026-04-21
## 1. 阶段目标
把当前 Universal 的 renderer list / default renderer index 从“资产层有配置,但运行时基本只吃默认 renderer”的状态收成真正可执行的 Unity 风格 renderer selection 主链。
本阶段完成后,要达到:
1. `RendererBackedRenderPipelineAsset` 不再在 request / plan / execution 三处各自偷偷取默认 renderer
2. 相机级 renderer 选择能够在 request 阶段被正式解析,并沿着 frame plan 一路传到 execution
3. Universal 能像 Unity URP 一样,先支持“相机覆盖 renderer index”这条最关键的链路
4. 后续继续做 renderer inspector、多 renderer、deferred renderer 时,不需要再返工主链
## 2. 当前问题
当前已经有:
1. `rendererDataList`
2. `defaultRendererIndex`
3. `GetRenderer(index)` / `GetRendererData(index)`
但是主链仍然不完整:
1. `ConfigureCameraRenderRequest()` 默认只下发到 default renderer data
2. `ConfigureCameraFramePlan()` 默认只下发到 default renderer data
3. `RendererBackedRenderPipeline.ResolveRenderer(...)` 录制阶段也只拿 default renderer
4. 没有正式“当前 camera 这一帧最终选中了哪个 renderer index”的 request / plan / context 数据
这意味着:
1. renderer list 现在更多只是配置壳,不是运行时 contract
2. 以后想做 Unity 风格不同 rendererForward Renderer / 2D Renderer / 自定义 Renderer主链会重新散掉
3. 即便后面加 `UniversalAdditionalCameraData`,也没有稳定的数据路径把选择结果带到 execution
## 3. 设计原则
这一阶段按 Unity 的职责分层来收:
1. camera 侧决定是否覆盖 renderer index
2. pipeline asset 负责解析“这一帧这个 camera 应该用哪个 renderer”
3. request / frame plan / render context 负责携带“已解析好的 renderer index”
4. renderer data / renderer / feature 只吃解析结果,不自己再猜
也就是:
`camera override -> request.rendererIndex -> plan.rendererIndex -> execution resolve renderer`
## 4. 本阶段范围
包括:
1. 给 native `CameraRenderRequest` 增加正式 `rendererIndex`
2. 给 managed request / planning / render context 暴露当前 renderer index
3.`RendererBackedRenderPipelineAsset` 统一通过“已解析 renderer index”选择 renderer data / renderer
4. 给 Universal 增加最小版 `UniversalAdditionalCameraData`
5.`UniversalRenderPipelineAsset` 支持相机覆盖 renderer index
6. 重编译 `XCEditor`
7. 运行旧版 `editor/bin/Debug/XCEngine.exe` 冒烟至少 10 秒
不包括:
1. 多 backend renderer 混挂
2. renderer inspector UI
3. deferred renderer
4. camera stack / overlay renderer 体系
5. 完整 Unity `CameraData.renderer` / `cameraData.camera` API 还原
## 5. 实施步骤
### Step 1把 renderer selection 结果正式写进 request / plan / context
做这几件事:
1. native `CameraRenderRequest` 增加 `rendererIndex`
2. managed `CameraRenderRequestContext` 增加 `camera``rendererIndex`
3. managed planning / render context 增加只读 `rendererIndex`
目标是让 selection 结果不再是执行时临时猜出来,而是 request 阶段就正式落下。
### Step 2统一 RendererBackedRenderPipelineAsset 的 renderer resolve 入口
把现在这些默认 renderer 路径统一起来:
1. `ConfigureCameraRenderRequest`
2. `ConfigureCameraFramePlan`
3. `ResolveRenderer`
要求:
1. request 阶段先解析 renderer index
2. 后续 plan / execution 全部吃这个结果
3. default fallback 规则只有一套
### Step 3补 Universal 的 camera override seam
新增:
1. `UniversalAdditionalCameraData`
2. `UniversalRenderPipelineAsset` 对相机 `rendererIndex` 覆盖的解析逻辑
先只做最小可用版:
1. `rendererIndex = -1` 表示使用 pipeline default renderer
2. `rendererIndex >= 0` 表示请求指定 renderer slot
3. 越界仍然回退 default renderer
### Step 4编译与冒烟
固定流程:
1. `cmake --build . --config Debug --target XCEditor`
2. 启动 `editor/bin/Debug/XCEngine.exe`
3. 冒烟至少 10 秒
4. 检查 `editor/bin/Debug/editor.log`
## 6. 验收标准
本阶段收口后必须满足:
1. Universal renderer list 不再只是配置壳,而是正式进入 request / plan / execution 主链
2. `RendererBackedRenderPipelineAsset` 的 renderer 选择规则唯一
3. camera 可以正式覆盖 renderer index并稳定回退 default renderer
4. `XCEditor` 编译通过
5. 旧 editor 冒烟通过

View File

@@ -29,6 +29,7 @@ struct CameraRenderRequest {
ObjectIdRenderRequest objectId;
float cameraDepth = 0.0f;
uint8_t cameraStackOrder = 0;
int32_t rendererIndex = -1;
RenderClearFlags clearFlags = RenderClearFlags::All;
bool hasClearColorOverride = false;
Math::Color clearColorOverride = Math::Color::Black();

View File

@@ -50,6 +50,7 @@ struct RenderPipelineStageRenderGraphContext {
CameraFrameColorSource::ExplicitSurface;
bool usesGraphManagedOutputColor = false;
DirectionalShadowRenderPlan directionalShadowPlan = {};
int32_t rendererIndex = -1;
};
class RenderPipelineRenderer;

View File

@@ -597,6 +597,8 @@ RenderPipelineStageRenderGraphContext BuildCameraFramePipelineStageRenderGraphCo
context.plan.UsesGraphManagedOutputColor(stageState.stage);
pipelineContext.directionalShadowPlan =
context.plan.directionalShadow;
pipelineContext.rendererIndex =
context.plan.request.rendererIndex;
return pipelineContext;
}

View File

@@ -3908,6 +3908,16 @@ int32_t InternalCall_Rendering_ScriptableRenderContext_GetStage(
: static_cast<int32_t>(Rendering::CameraFrameStage::MainScene);
}
int32_t InternalCall_Rendering_ScriptableRenderContext_GetRendererIndex(
uint64_t nativeHandle) {
const ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
return state != nullptr &&
state->graphContext != nullptr
? state->graphContext->rendererIndex
: -1;
}
int32_t InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
uint64_t nativeHandle) {
const ManagedScriptableRenderContextState* const state =
@@ -4833,6 +4843,43 @@ InternalCall_Rendering_CameraRenderRequestContext_GetRenderedRequestCount(
: 0;
}
uint64_t
InternalCall_Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID(
uint64_t nativeHandle) {
const ManagedCameraRenderRequestContextState* const state =
FindManagedCameraRenderRequestContextState(nativeHandle);
if (state == nullptr ||
state->request == nullptr ||
state->request->camera == nullptr ||
state->request->camera->GetGameObject() == nullptr) {
return 0u;
}
return state->request->camera->GetGameObject()->GetUUID();
}
int32_t InternalCall_Rendering_CameraRenderRequestContext_GetRendererIndex(
uint64_t nativeHandle) {
const ManagedCameraRenderRequestContextState* const state =
FindManagedCameraRenderRequestContextState(nativeHandle);
return state != nullptr &&
state->request != nullptr
? state->request->rendererIndex
: -1;
}
void InternalCall_Rendering_CameraRenderRequestContext_SetRendererIndex(
uint64_t nativeHandle,
int32_t rendererIndex) {
ManagedCameraRenderRequestContextState* const state =
FindManagedCameraRenderRequestContextState(nativeHandle);
if (state == nullptr || state->request == nullptr) {
return;
}
state->request->rendererIndex = rendererIndex;
}
mono_bool
InternalCall_Rendering_CameraRenderRequestContext_GetHasDirectionalShadow(
uint64_t nativeHandle) {
@@ -4856,6 +4903,17 @@ void InternalCall_Rendering_CameraRenderRequestContext_ClearDirectionalShadow(
state->request->directionalShadow = {};
}
int32_t
InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex(
uint64_t nativeHandle) {
const ManagedScriptableRenderPipelinePlanningContextState* const state =
FindManagedScriptableRenderPipelinePlanningContextState(nativeHandle);
return state != nullptr &&
state->plan != nullptr
? state->plan->request.rendererIndex
: -1;
}
mono_bool
InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested(
uint64_t nativeHandle,
@@ -5094,6 +5152,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_SetRenderPipelineAsset", reinterpret_cast<const void*>(&InternalCall_Rendering_SetRenderPipelineAsset));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_GetRenderPipelineAsset", reinterpret_cast<const void*>(&InternalCall_Rendering_GetRenderPipelineAsset));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetStage));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetSourceColorTextureHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetDepthTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetDepthTargetHandle));
@@ -5160,6 +5219,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderersByDesc", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordSceneInjectionPoint", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor));
@@ -5167,6 +5227,9 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetRenderedRequestCount", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetRenderedRequestCount));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_SetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_SetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetHasDirectionalShadow", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetHasDirectionalShadow));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_ClearDirectionalShadow", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_ClearDirectionalShadow));

View File

@@ -234,6 +234,7 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererFeature.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/StageColorData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalAdditionalCameraData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs

View File

@@ -17,7 +17,10 @@ namespace XCEngine.Rendering.Universal
RendererRecordingContext context)
{
return m_asset != null
? m_asset.ResolveSelectedRenderer()
? m_asset.ResolveRenderer(
context != null
? context.rendererIndex
: -1)
: null;
}
}

View File

@@ -25,11 +25,21 @@ namespace XCEngine.Rendering.Universal
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
ApplyResolvedRendererIndex(
context,
ResolveRendererIndex(context));
ConfigureRendererCameraRequest(
new RendererCameraRequestContext(context));
ApplyResolvedRendererIndex(
context,
context != null
? context.rendererIndex
: -1);
ScriptableRendererData resolvedRendererData =
ResolveSelectedRendererData();
ResolveRendererData(context);
if (resolvedRendererData != null)
{
resolvedRendererData
@@ -42,7 +52,7 @@ namespace XCEngine.Rendering.Universal
ScriptableRenderPipelinePlanningContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveSelectedRendererData();
ResolveRendererData(context);
if (resolvedRendererData != null)
{
resolvedRendererData
@@ -100,6 +110,12 @@ namespace XCEngine.Rendering.Universal
{
}
protected virtual int ResolveRendererIndex(
CameraRenderRequestContext context)
{
return ResolveSelectedRendererIndex();
}
protected virtual ScriptableRendererData
CreateDefaultRendererData()
{
@@ -135,10 +151,11 @@ namespace XCEngine.Rendering.Universal
int rendererIndex)
{
return ResolveRendererDataByResolvedIndex(
ResolveRendererIndex(rendererIndex));
ResolveRendererIndexWithFallback(
rendererIndex));
}
internal ScriptableRenderer GetRenderer(
internal ScriptableRenderer ResolveRenderer(
int rendererIndex)
{
ScriptableRendererData rendererData =
@@ -255,10 +272,43 @@ namespace XCEngine.Rendering.Universal
private int ResolveSelectedRendererIndex()
{
return ResolveRendererIndex(defaultRendererIndex);
return ResolveRendererIndexWithFallback(
defaultRendererIndex);
}
private int ResolveRendererIndex(
private ScriptableRendererData ResolveRendererData(
CameraRenderRequestContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private ScriptableRendererData ResolveRendererData(
ScriptableRenderPipelinePlanningContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private void ApplyResolvedRendererIndex(
CameraRenderRequestContext context,
int rendererIndex)
{
if (context == null)
{
return;
}
context.rendererIndex =
ResolveRendererIndexWithFallback(
rendererIndex);
}
private int ResolveRendererIndexWithFallback(
int rendererIndex)
{
EnsureRendererDataList();

View File

@@ -1,3 +1,4 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
@@ -22,6 +23,26 @@ namespace XCEngine.Rendering.Universal
? m_requestContext.renderedRequestCount
: 0;
public Camera camera =>
m_requestContext != null
? m_requestContext.camera
: null;
public int rendererIndex
{
get =>
m_requestContext != null
? m_requestContext.rendererIndex
: -1;
set
{
if (m_requestContext != null)
{
m_requestContext.rendererIndex = value;
}
}
}
internal CameraRenderRequestContext requestContext =>
m_requestContext;
}

View File

@@ -42,6 +42,9 @@ namespace XCEngine.Rendering.Universal
public RenderingData renderingData =>
m_renderingData;
public int rendererIndex =>
m_renderingData.rendererIndex;
internal ScriptableRenderContext renderContext =>
m_renderContext;
}

View File

@@ -8,6 +8,7 @@ namespace XCEngine.Rendering.Universal
internal RenderingData(CameraFrameStage stage)
: this(
stage,
-1,
CameraData.Default,
LightingData.Default,
ShadowData.Default,
@@ -22,6 +23,9 @@ namespace XCEngine.Rendering.Universal
context != null
? context.stage
: CameraFrameStage.MainScene,
context != null
? context.rendererIndex
: -1,
context != null
? RenderingDataResolver.ResolveCameraData(context)
: CameraData.Default,
@@ -45,6 +49,7 @@ namespace XCEngine.Rendering.Universal
private RenderingData(
CameraFrameStage stage,
int rendererIndex,
CameraData cameraData,
LightingData lightingData,
ShadowData shadowData,
@@ -53,6 +58,7 @@ namespace XCEngine.Rendering.Universal
StageColorData stageColorData)
{
this.stage = stage;
this.rendererIndex = rendererIndex;
this.cameraData = cameraData ?? CameraData.Default;
this.lightingData =
lightingData ?? LightingData.Default;
@@ -68,6 +74,8 @@ namespace XCEngine.Rendering.Universal
public CameraFrameStage stage { get; }
public int rendererIndex { get; }
public CameraData cameraData { get; }
public LightingData lightingData { get; }

View File

@@ -0,0 +1,18 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class UniversalAdditionalCameraData
: MonoBehaviour
{
public int rendererIndex = -1;
public bool hasRendererOverride =>
rendererIndex >= 0;
public void ResetRenderer()
{
rendererIndex = -1;
}
}
}

View File

@@ -17,6 +17,27 @@ namespace XCEngine.Rendering.Universal
{
return new UniversalRendererData();
}
protected override int ResolveRendererIndex(
CameraRenderRequestContext context)
{
Camera camera =
context != null
? context.camera
: null;
if (camera != null)
{
UniversalAdditionalCameraData additionalCameraData =
camera.GetComponent<UniversalAdditionalCameraData>();
if (additionalCameraData != null &&
additionalCameraData.hasRendererOverride)
{
return additionalCameraData.rendererIndex;
}
}
return base.ResolveRendererIndex(context);
}
}
}

View File

@@ -389,6 +389,11 @@ namespace XCEngine
internal static extern int Rendering_ScriptableRenderContext_GetStage(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderContext_GetRendererIndex(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
@@ -473,6 +478,11 @@ namespace XCEngine
ulong nativeHandle,
ulong rasterPassHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested(
@@ -802,6 +812,22 @@ namespace XCEngine
Rendering_CameraRenderRequestContext_GetRenderedRequestCount(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern ulong
Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_CameraRenderRequestContext_GetRendererIndex(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void
Rendering_CameraRenderRequestContext_SetRendererIndex(
ulong nativeHandle,
int rendererIndex);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_CameraRenderRequestContext_GetHasDirectionalShadow(

View File

@@ -21,6 +21,38 @@ namespace XCEngine.Rendering
.Rendering_CameraRenderRequestContext_GetRenderedRequestCount(
m_nativeHandle);
public Camera camera
{
get
{
ulong cameraGameObjectUUID =
InternalCalls
.Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID(
m_nativeHandle);
if (cameraGameObjectUUID == 0)
{
return null;
}
GameObject gameObject =
new GameObject(cameraGameObjectUUID);
return gameObject.GetComponent<Camera>();
}
}
public int rendererIndex
{
get =>
InternalCalls
.Rendering_CameraRenderRequestContext_GetRendererIndex(
m_nativeHandle);
set =>
InternalCalls
.Rendering_CameraRenderRequestContext_SetRendererIndex(
m_nativeHandle,
value);
}
internal ulong nativeHandle =>
m_nativeHandle;
}

View File

@@ -15,6 +15,11 @@ namespace XCEngine.Rendering
(CameraFrameStage)InternalCalls.Rendering_ScriptableRenderContext_GetStage(
m_nativeHandle);
public int rendererIndex =>
InternalCalls
.Rendering_ScriptableRenderContext_GetRendererIndex(
m_nativeHandle);
public RenderGraphTextureHandle sourceColorTexture =>
RenderGraphTextureHandle.FromNativeIndex(
InternalCalls

View File

@@ -12,6 +12,11 @@ namespace XCEngine.Rendering
m_nativeHandle = nativeHandle;
}
public int rendererIndex =>
InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex(
m_nativeHandle);
public bool IsStageRequested(
CameraFrameStage stage)
{