Restore panoramic skybox path for skybox integration

This commit is contained in:
2026-04-06 02:42:08 +08:00
parent ae4c06d7b6
commit dc17685099
10 changed files with 22265 additions and 13051 deletions

View File

@@ -369,7 +369,8 @@ bool BuiltinForwardPipeline::ExecuteForwardSkyboxPass(const RenderPassContext& p
m_skyboxPipelineState == nullptr ||
m_skyboxEnvironmentSet.set == nullptr ||
m_skyboxMaterialSet.set == nullptr ||
m_skyboxTextureSet.set == nullptr ||
m_skyboxPanoramicTextureSet.set == nullptr ||
m_skyboxCubemapTextureSet.set == nullptr ||
m_skyboxSamplerSet.set == nullptr) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
@@ -392,14 +393,44 @@ bool BuiltinForwardPipeline::ExecuteForwardSkyboxPass(const RenderPassContext& p
const Resources::Material* skyboxMaterial = sceneData.environment.HasMaterialSkybox()
? sceneData.environment.materialSkybox.material
: nullptr;
const Resources::Texture* skyboxTexture = ResolveSkyboxTexture(skyboxMaterial);
RHI::RHIResourceView* skyboxTextureView = ResolveTextureView(skyboxTexture);
const bool useTexturedSkybox = sceneData.environment.HasMaterialSkybox() && skyboxTextureView != nullptr;
if (skyboxTextureView == nullptr) {
skyboxTextureView = m_fallbackTextureCubeView;
}
const Resources::Texture* panoramicSkyboxTexture = ResolveSkyboxPanoramicTexture(skyboxMaterial);
const Resources::Texture* cubemapSkyboxTexture = ResolveSkyboxCubemapTexture(skyboxMaterial);
RHI::RHIResourceView* panoramicSkyboxTextureView = ResolveTextureView(panoramicSkyboxTexture);
RHI::RHIResourceView* cubemapSkyboxTextureView = ResolveTextureView(cubemapSkyboxTexture);
const BuiltinSkyboxMaterialData skyboxMaterialData = BuildBuiltinSkyboxMaterialData(skyboxMaterial);
BuiltinSkyboxTextureMode activeTextureMode = BuiltinSkyboxTextureMode::None;
switch (skyboxMaterialData.textureMode) {
case BuiltinSkyboxTextureMode::Panoramic:
if (panoramicSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Panoramic;
} else if (cubemapSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Cubemap;
}
break;
case BuiltinSkyboxTextureMode::Cubemap:
if (cubemapSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Cubemap;
} else if (panoramicSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Panoramic;
}
break;
case BuiltinSkyboxTextureMode::None:
default:
if (panoramicSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Panoramic;
} else if (cubemapSkyboxTextureView != nullptr) {
activeTextureMode = BuiltinSkyboxTextureMode::Cubemap;
}
break;
}
if (panoramicSkyboxTextureView == nullptr) {
panoramicSkyboxTextureView = m_fallbackTexture2DView;
}
if (cubemapSkyboxTextureView == nullptr) {
cubemapSkyboxTextureView = m_fallbackTextureCubeView;
}
SkyboxMaterialConstants materialConstants = {};
materialConstants.tintAndExposure = Math::Vector4(
skyboxMaterialData.tint.x,
@@ -408,15 +439,19 @@ bool BuiltinForwardPipeline::ExecuteForwardSkyboxPass(const RenderPassContext& p
std::max(0.0f, skyboxMaterialData.exposure));
materialConstants.rotationRadiansAndMode = Math::Vector4(
Math::Radians(skyboxMaterialData.rotationDegrees),
useTexturedSkybox ? 1.0f : 0.0f,
static_cast<float>(activeTextureMode),
0.0f,
0.0f);
m_skyboxEnvironmentSet.set->WriteConstant(0, &constants, sizeof(constants));
m_skyboxMaterialSet.set->WriteConstant(0, &materialConstants, sizeof(materialConstants));
if (m_skyboxBoundTextureView != skyboxTextureView) {
m_skyboxTextureSet.set->Update(0, skyboxTextureView);
m_skyboxBoundTextureView = skyboxTextureView;
if (m_skyboxBoundPanoramicTextureView != panoramicSkyboxTextureView) {
m_skyboxPanoramicTextureSet.set->Update(0, panoramicSkyboxTextureView);
m_skyboxBoundPanoramicTextureView = panoramicSkyboxTextureView;
}
if (m_skyboxBoundCubemapTextureView != cubemapSkyboxTextureView) {
m_skyboxCubemapTextureSet.set->Update(0, cubemapSkyboxTextureView);
m_skyboxBoundCubemapTextureView = cubemapSkyboxTextureView;
}
RHI::RHICommandList* commandList = context.commandList;
@@ -425,10 +460,11 @@ bool BuiltinForwardPipeline::ExecuteForwardSkyboxPass(const RenderPassContext& p
RHI::RHIDescriptorSet* descriptorSets[] = {
m_skyboxEnvironmentSet.set,
m_skyboxMaterialSet.set,
m_skyboxTextureSet.set,
m_skyboxPanoramicTextureSet.set,
m_skyboxCubemapTextureSet.set,
m_skyboxSamplerSet.set
};
commandList->SetGraphicsDescriptorSets(0, 4, descriptorSets, m_skyboxPipelineLayout);
commandList->SetGraphicsDescriptorSets(0, 5, descriptorSets, m_skyboxPipelineLayout);
commandList->Draw(3, 1, 0, 0);
return true;
}
@@ -630,7 +666,8 @@ bool BuiltinForwardPipeline::EnsureSkyboxResources(const RenderContext& context)
m_skyboxPipelineState != nullptr &&
m_skyboxEnvironmentSet.set != nullptr &&
m_skyboxMaterialSet.set != nullptr &&
m_skyboxTextureSet.set != nullptr &&
m_skyboxPanoramicTextureSet.set != nullptr &&
m_skyboxCubemapTextureSet.set != nullptr &&
m_skyboxSamplerSet.set != nullptr) {
return true;
}
@@ -685,9 +722,13 @@ bool BuiltinForwardPipeline::CreateSkyboxResources(const RenderContext& context)
materialLayout.bindings = &materialBinding;
materialLayout.bindingCount = 1;
RHI::DescriptorSetLayoutDesc textureLayout = {};
textureLayout.bindings = &textureBinding;
textureLayout.bindingCount = 1;
RHI::DescriptorSetLayoutDesc panoramicTextureLayout = {};
panoramicTextureLayout.bindings = &textureBinding;
panoramicTextureLayout.bindingCount = 1;
RHI::DescriptorSetLayoutDesc cubemapTextureLayout = {};
cubemapTextureLayout.bindings = &textureBinding;
cubemapTextureLayout.bindingCount = 1;
RHI::DescriptorSetLayoutDesc samplerLayout = {};
samplerLayout.bindings = &samplerBinding;
@@ -696,13 +737,14 @@ bool BuiltinForwardPipeline::CreateSkyboxResources(const RenderContext& context)
RHI::DescriptorSetLayoutDesc setLayouts[] = {
environmentLayout,
materialLayout,
textureLayout,
panoramicTextureLayout,
cubemapTextureLayout,
samplerLayout
};
RHI::RHIPipelineLayoutDesc pipelineLayoutDesc = {};
pipelineLayoutDesc.setLayouts = setLayouts;
pipelineLayoutDesc.setLayoutCount = 4;
pipelineLayoutDesc.setLayoutCount = 5;
m_skyboxPipelineLayout = m_device->CreatePipelineLayout(pipelineLayoutDesc);
if (m_skyboxPipelineLayout == nullptr) {
Debug::Logger::Get().Error(
@@ -741,10 +783,15 @@ bool BuiltinForwardPipeline::CreateSkyboxResources(const RenderContext& context)
false,
m_skyboxMaterialSet) ||
!createSkyboxDescriptorSet(
textureLayout,
panoramicTextureLayout,
RHI::DescriptorHeapType::CBV_SRV_UAV,
true,
m_skyboxTextureSet) ||
m_skyboxPanoramicTextureSet) ||
!createSkyboxDescriptorSet(
cubemapTextureLayout,
RHI::DescriptorHeapType::CBV_SRV_UAV,
true,
m_skyboxCubemapTextureSet) ||
!createSkyboxDescriptorSet(
samplerLayout,
RHI::DescriptorHeapType::Sampler,
@@ -758,8 +805,10 @@ bool BuiltinForwardPipeline::CreateSkyboxResources(const RenderContext& context)
}
m_skyboxSamplerSet.set->UpdateSampler(0, m_sampler);
m_skyboxTextureSet.set->Update(0, m_fallbackTextureCubeView);
m_skyboxBoundTextureView = m_fallbackTextureCubeView;
m_skyboxPanoramicTextureSet.set->Update(0, m_fallbackTexture2DView);
m_skyboxCubemapTextureSet.set->Update(0, m_fallbackTextureCubeView);
m_skyboxBoundPanoramicTextureView = m_fallbackTexture2DView;
m_skyboxBoundCubemapTextureView = m_fallbackTextureCubeView;
m_skyboxPipelineState = m_device->CreatePipelineState(
CreateSkyboxPipelineDesc(
@@ -786,10 +835,12 @@ void BuiltinForwardPipeline::DestroySkyboxResources() {
}
DestroyOwnedDescriptorSet(m_skyboxSamplerSet);
DestroyOwnedDescriptorSet(m_skyboxTextureSet);
DestroyOwnedDescriptorSet(m_skyboxCubemapTextureSet);
DestroyOwnedDescriptorSet(m_skyboxPanoramicTextureSet);
DestroyOwnedDescriptorSet(m_skyboxMaterialSet);
DestroyOwnedDescriptorSet(m_skyboxEnvironmentSet);
m_skyboxBoundTextureView = nullptr;
m_skyboxBoundPanoramicTextureView = nullptr;
m_skyboxBoundCubemapTextureView = nullptr;
if (m_skyboxPipelineLayout != nullptr) {
m_skyboxPipelineLayout->Shutdown();