feat(srp): add drawing settings override material seam

- add a managed DrawingSettings seam for scene draw authoring
- let builtin forward scene draws use an override material when provided
- wire DrawObjectsPass and RenderObjectsRendererFeature through the new settings
This commit is contained in:
2026-04-20 22:46:19 +08:00
parent fece3a84ad
commit 0319680954
12 changed files with 158 additions and 18 deletions

View File

@@ -307,8 +307,7 @@ RHI::RHIResourceView* BuiltinForwardPipeline::ResolveTextureView(
}
RHI::RHIResourceView* BuiltinForwardPipeline::ResolveTextureView(
const VisibleRenderItem& visibleItem) {
const Resources::Material* material = ResolveMaterial(visibleItem);
const Resources::Material* material) {
const Resources::Texture* texture = ResolveTexture(material);
RHI::RHIResourceView* textureView = ResolveTextureView(texture);
return textureView != nullptr ? textureView : m_fallbackTexture2DView;
@@ -402,7 +401,8 @@ bool BuiltinForwardPipeline::ExecuteForwardTransparentPass(
bool BuiltinForwardPipeline::DrawVisibleItem(
const FrameExecutionContext& executionContext,
const VisibleRenderItem& visibleItem) {
const VisibleRenderItem& visibleItem,
const Resources::Material* material) {
const RenderContext& context = executionContext.renderContext;
const RenderSceneData& sceneData = executionContext.sceneData;
@@ -435,7 +435,6 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
shadowReceiverConstants.shadowSampling = sceneData.lighting.mainDirectionalShadow.sampling;
}
const Resources::Material* material = ResolveMaterial(visibleItem);
const ResolvedShaderPass resolvedShaderPass = ResolveSurfaceShaderPass(sceneData, material);
if (resolvedShaderPass.shader == nullptr || resolvedShaderPass.pass == nullptr) {
return false;
@@ -452,7 +451,7 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
return false;
}
RHI::RHIResourceView* baseColorTextureView = ResolveTextureView(visibleItem);
RHI::RHIResourceView* baseColorTextureView = ResolveTextureView(material);
if (passLayout->baseColorTexture.IsValid() && baseColorTextureView == nullptr) {
return false;
}
@@ -585,7 +584,10 @@ bool BuiltinForwardPipeline::DrawVisibleItems(
return;
}
const Resources::Material* material = ResolveMaterial(visibleItem);
const Resources::Material* material =
drawSettings.HasOverrideMaterial()
? drawSettings.overrideMaterial.Get()
: ResolveMaterial(visibleItem);
BuiltinMaterialPass pass = BuiltinMaterialPass::ForwardLit;
if (!TryResolveSurfacePassType(material, pass)) {
return;
@@ -601,7 +603,7 @@ bool BuiltinForwardPipeline::DrawVisibleItems(
currentPipelineState = pipelineState;
}
if (!DrawVisibleItem(executionContext, visibleItem)) {
if (!DrawVisibleItem(executionContext, visibleItem, material)) {
drawFailed = true;
}
};