feat(srp): add render layer filtering to scene draw

- carry MeshRenderer renderLayer through scene extraction into VisibleRenderItem
- extend native and managed FilteringSettings with renderLayerMask support
- let RenderObjectsRendererFeature author layer-filtered object draws
This commit is contained in:
2026-04-20 22:21:29 +08:00
parent 5237da23dd
commit fece3a84ad
8 changed files with 25 additions and 2 deletions

View File

@@ -26,12 +26,14 @@ enum class RendererSortMode : Core::uint32 {
struct FilteringSettings {
Core::int32 renderQueueMin = std::numeric_limits<Core::int32>::lowest();
Core::int32 renderQueueMax = std::numeric_limits<Core::int32>::max();
Core::uint32 renderLayerMask = std::numeric_limits<Core::uint32>::max();
bool requireShadowCasting = false;
bool requireRenderObjectId = false;
bool operator==(const FilteringSettings& other) const {
return renderQueueMin == other.renderQueueMin &&
renderQueueMax == other.renderQueueMax &&
renderLayerMask == other.renderLayerMask &&
requireShadowCasting == other.requireShadowCasting &&
requireRenderObjectId == other.requireRenderObjectId;
}

View File

@@ -72,6 +72,12 @@ inline bool MatchesFilteringSettings(
return false;
}
if (visibleItem.renderLayer >= 32u ||
((filtering.renderLayerMask &
(1u << visibleItem.renderLayer)) == 0u)) {
return false;
}
if (filtering.requireShadowCasting &&
visibleItem.meshRenderer != nullptr &&
!visibleItem.meshRenderer->GetCastShadows()) {

View File

@@ -24,6 +24,7 @@ struct VisibleRenderItem {
Core::uint32 materialIndex = 0;
Core::uint32 sectionIndex = 0;
bool hasSection = false;
Core::uint32 renderLayer = 0;
Core::int32 renderQueue = 0;
float cameraDistanceSq = 0.0f;
Math::Matrix4x4 localToWorld = Math::Matrix4x4::Identity();