Update editor viewport rendering integration

This commit is contained in:
2026-04-28 18:34:28 +08:00
parent d1a717091d
commit 9b6adf1806
6 changed files with 141 additions and 2 deletions

View File

@@ -189,7 +189,8 @@ BuiltinForwardPipeline::CachedDescriptorSet* BuiltinForwardPipeline::GetOrCreate
}
}
const Core::uint64 materialVersion = material != nullptr ? material->GetChangeVersion() : 0;
const Core::uint64 materialVersion =
material != nullptr ? material->GetChangeVersion() : 1u;
if (setLayout.usesMaterial) {
if (!passLayout.material.IsValid() || passLayout.material.set != setIndex) {
return nullptr;

View File

@@ -25,6 +25,15 @@ namespace {
constexpr float kForwardAmbientIntensity = 0.28f;
constexpr float kSpotInnerAngleRatio = 0.8f;
struct BuiltinForwardMaterialConstants {
Math::Vector4 baseColorFactor = Math::Vector4::One();
Math::Vector4 alphaCutoffParams = Math::Vector4(0.5f, 0.0f, 0.0f, 0.0f);
};
struct BuiltinUnlitMaterialConstants {
Math::Vector4 baseColorFactor = Math::Vector4::One();
};
Resources::ShaderKeywordSet ResolvePassKeywordSet(
const RenderSceneData& sceneData,
const Resources::Material* material) {
@@ -106,6 +115,82 @@ bool UsesDynamicSurfaceDescriptorSet(const BuiltinPassSetLayoutMetadata& setLayo
setLayout.usesMaterialBuffers;
}
MaterialConstantPayloadView ResolveBuiltinForwardMaterialConstantPayload(
const Resources::Material* material,
BuiltinForwardMaterialConstants& outConstants,
Resources::MaterialConstantFieldDesc (&outLayout)[2]) {
outConstants.baseColorFactor = ResolveBuiltinBaseColorFactor(material);
outConstants.alphaCutoffParams =
Math::Vector4(ResolveBuiltinAlphaCutoff(material), 0.0f, 0.0f, 0.0f);
outLayout[0].name = "gBaseColorFactor";
outLayout[0].type = Resources::MaterialPropertyType::Float4;
outLayout[0].offset = 0u;
outLayout[0].size = static_cast<Core::uint32>(sizeof(Math::Vector4));
outLayout[0].alignedSize = static_cast<Core::uint32>(sizeof(Math::Vector4));
outLayout[1].name = "gAlphaCutoffParams";
outLayout[1].type = Resources::MaterialPropertyType::Float4;
outLayout[1].offset = static_cast<Core::uint32>(sizeof(Math::Vector4));
outLayout[1].size = static_cast<Core::uint32>(sizeof(Math::Vector4));
outLayout[1].alignedSize = static_cast<Core::uint32>(sizeof(Math::Vector4));
MaterialConstantLayoutView layoutView = {};
layoutView.fields = outLayout;
layoutView.count = 2u;
layoutView.size = sizeof(BuiltinForwardMaterialConstants);
return { &outConstants, sizeof(BuiltinForwardMaterialConstants), layoutView };
}
MaterialConstantPayloadView ResolveBuiltinUnlitMaterialConstantPayload(
const Resources::Material* material,
BuiltinUnlitMaterialConstants& outConstants,
Resources::MaterialConstantFieldDesc (&outLayout)[1]) {
outConstants.baseColorFactor = ResolveBuiltinBaseColorFactor(material);
outLayout[0].name = "gBaseColorFactor";
outLayout[0].type = Resources::MaterialPropertyType::Float4;
outLayout[0].offset = 0u;
outLayout[0].size = static_cast<Core::uint32>(sizeof(Math::Vector4));
outLayout[0].alignedSize = static_cast<Core::uint32>(sizeof(Math::Vector4));
MaterialConstantLayoutView layoutView = {};
layoutView.fields = outLayout;
layoutView.count = 1u;
layoutView.size = sizeof(BuiltinUnlitMaterialConstants);
return { &outConstants, sizeof(BuiltinUnlitMaterialConstants), layoutView };
}
MaterialConstantPayloadView ResolveSurfaceMaterialConstantPayload(
const Resources::Shader* resolvedShader,
const Resources::Material* material,
const Resources::Shader* builtinForwardShader,
const Resources::Shader* builtinUnlitShader,
const Resources::Shader* builtinDepthOnlyShader,
const Resources::Shader* builtinShadowCasterShader,
BuiltinForwardMaterialConstants& outForwardConstants,
Resources::MaterialConstantFieldDesc (&outForwardLayout)[2],
BuiltinUnlitMaterialConstants& outUnlitConstants,
Resources::MaterialConstantFieldDesc (&outUnlitLayout)[1]) {
if (resolvedShader == builtinUnlitShader) {
return ResolveBuiltinUnlitMaterialConstantPayload(
material,
outUnlitConstants,
outUnlitLayout);
}
if (resolvedShader == builtinForwardShader ||
resolvedShader == builtinDepthOnlyShader ||
resolvedShader == builtinShadowCasterShader) {
return ResolveBuiltinForwardMaterialConstantPayload(
material,
outForwardConstants,
outForwardLayout);
}
return ResolveSchemaMaterialConstantPayload(material);
}
bool TryResolveRequestedSurfacePassType(
const DrawSettings& drawSettings,
BuiltinMaterialPass& outPass,
@@ -557,7 +642,22 @@ bool BuiltinForwardPipeline::DrawVisibleItem(
return false;
}
MaterialConstantPayloadView materialConstants = ResolveSchemaMaterialConstantPayload(material);
BuiltinForwardMaterialConstants builtinForwardConstants = {};
Resources::MaterialConstantFieldDesc builtinForwardLayout[2] = {};
BuiltinUnlitMaterialConstants builtinUnlitConstants = {};
Resources::MaterialConstantFieldDesc builtinUnlitLayout[1] = {};
MaterialConstantPayloadView materialConstants =
ResolveSurfaceMaterialConstantPayload(
resolvedShaderPass.shader,
material,
m_builtinForwardShader.Get(),
m_builtinUnlitShader.Get(),
m_builtinDepthOnlyShader.Get(),
m_builtinShadowCasterShader.Get(),
builtinForwardConstants,
builtinForwardLayout,
builtinUnlitConstants,
builtinUnlitLayout);
if (passLayout->material.IsValid() && !materialConstants.IsValid()) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,