Formalize cubemap skybox pipeline across backends
This commit is contained in:
@@ -396,7 +396,7 @@ bool BuiltinForwardPipeline::ExecuteForwardSkyboxPass(const RenderPassContext& p
|
||||
RHI::RHIResourceView* skyboxTextureView = ResolveTextureView(skyboxTexture);
|
||||
const bool useTexturedSkybox = sceneData.environment.HasMaterialSkybox() && skyboxTextureView != nullptr;
|
||||
if (skyboxTextureView == nullptr) {
|
||||
skyboxTextureView = m_fallbackTextureView;
|
||||
skyboxTextureView = m_fallbackTextureCubeView;
|
||||
}
|
||||
|
||||
const BuiltinSkyboxMaterialData skyboxMaterialData = BuildBuiltinSkyboxMaterialData(skyboxMaterial);
|
||||
@@ -553,29 +553,72 @@ bool BuiltinForwardPipeline::CreatePipelineResources(const RenderContext& contex
|
||||
return false;
|
||||
}
|
||||
|
||||
const unsigned char whitePixel[4] = { 255, 255, 255, 255 };
|
||||
RHI::TextureDesc textureDesc = {};
|
||||
textureDesc.width = 1;
|
||||
textureDesc.height = 1;
|
||||
textureDesc.depth = 1;
|
||||
textureDesc.mipLevels = 1;
|
||||
textureDesc.arraySize = 1;
|
||||
textureDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
textureDesc.textureType = static_cast<uint32_t>(RHI::TextureType::Texture2D);
|
||||
textureDesc.sampleCount = 1;
|
||||
textureDesc.sampleQuality = 0;
|
||||
textureDesc.flags = 0;
|
||||
m_fallbackTexture = context.device->CreateTexture(textureDesc, whitePixel, sizeof(whitePixel), 4);
|
||||
if (m_fallbackTexture == nullptr) {
|
||||
const unsigned char whitePixels2D[4] = {
|
||||
255, 255, 255, 255
|
||||
};
|
||||
RHI::TextureDesc fallback2DDesc = {};
|
||||
fallback2DDesc.width = 1;
|
||||
fallback2DDesc.height = 1;
|
||||
fallback2DDesc.depth = 1;
|
||||
fallback2DDesc.mipLevels = 1;
|
||||
fallback2DDesc.arraySize = 1;
|
||||
fallback2DDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
fallback2DDesc.textureType = static_cast<uint32_t>(RHI::TextureType::Texture2D);
|
||||
fallback2DDesc.sampleCount = 1;
|
||||
fallback2DDesc.sampleQuality = 0;
|
||||
fallback2DDesc.flags = 0;
|
||||
m_fallbackTexture2D = context.device->CreateTexture(
|
||||
fallback2DDesc,
|
||||
whitePixels2D,
|
||||
sizeof(whitePixels2D),
|
||||
sizeof(whitePixels2D));
|
||||
if (m_fallbackTexture2D == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RHI::ResourceViewDesc textureViewDesc = {};
|
||||
textureViewDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
textureViewDesc.dimension = RHI::ResourceViewDimension::Texture2D;
|
||||
textureViewDesc.mipLevel = 0;
|
||||
m_fallbackTextureView = context.device->CreateShaderResourceView(m_fallbackTexture, textureViewDesc);
|
||||
if (m_fallbackTextureView == nullptr) {
|
||||
RHI::ResourceViewDesc fallback2DViewDesc = {};
|
||||
fallback2DViewDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
fallback2DViewDesc.dimension = RHI::ResourceViewDimension::Texture2D;
|
||||
fallback2DViewDesc.mipLevel = 0;
|
||||
m_fallbackTexture2DView = context.device->CreateShaderResourceView(m_fallbackTexture2D, fallback2DViewDesc);
|
||||
if (m_fallbackTexture2DView == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const unsigned char whitePixelsCube[6 * 4] = {
|
||||
255, 255, 255, 255,
|
||||
255, 255, 255, 255,
|
||||
255, 255, 255, 255,
|
||||
255, 255, 255, 255,
|
||||
255, 255, 255, 255,
|
||||
255, 255, 255, 255
|
||||
};
|
||||
RHI::TextureDesc fallbackCubeDesc = {};
|
||||
fallbackCubeDesc.width = 1;
|
||||
fallbackCubeDesc.height = 1;
|
||||
fallbackCubeDesc.depth = 1;
|
||||
fallbackCubeDesc.mipLevels = 1;
|
||||
fallbackCubeDesc.arraySize = 6;
|
||||
fallbackCubeDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
fallbackCubeDesc.textureType = static_cast<uint32_t>(RHI::TextureType::TextureCube);
|
||||
fallbackCubeDesc.sampleCount = 1;
|
||||
fallbackCubeDesc.sampleQuality = 0;
|
||||
fallbackCubeDesc.flags = 0;
|
||||
m_fallbackTextureCube = context.device->CreateTexture(
|
||||
fallbackCubeDesc,
|
||||
whitePixelsCube,
|
||||
sizeof(whitePixelsCube),
|
||||
4);
|
||||
if (m_fallbackTextureCube == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RHI::ResourceViewDesc fallbackCubeViewDesc = {};
|
||||
fallbackCubeViewDesc.format = static_cast<uint32_t>(RHI::Format::R8G8B8A8_UNorm);
|
||||
fallbackCubeViewDesc.dimension = RHI::ResourceViewDimension::TextureCube;
|
||||
fallbackCubeViewDesc.mipLevel = 0;
|
||||
m_fallbackTextureCubeView = context.device->CreateShaderResourceView(m_fallbackTextureCube, fallbackCubeViewDesc);
|
||||
if (m_fallbackTextureCubeView == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -715,8 +758,8 @@ bool BuiltinForwardPipeline::CreateSkyboxResources(const RenderContext& context)
|
||||
}
|
||||
|
||||
m_skyboxSamplerSet.set->UpdateSampler(0, m_sampler);
|
||||
m_skyboxTextureSet.set->Update(0, m_fallbackTextureView);
|
||||
m_skyboxBoundTextureView = m_fallbackTextureView;
|
||||
m_skyboxTextureSet.set->Update(0, m_fallbackTextureCubeView);
|
||||
m_skyboxBoundTextureView = m_fallbackTextureCubeView;
|
||||
|
||||
m_skyboxPipelineState = m_device->CreatePipelineState(
|
||||
CreateSkyboxPipelineDesc(
|
||||
@@ -776,18 +819,30 @@ void BuiltinForwardPipeline::DestroyPipelineResources() {
|
||||
}
|
||||
m_passResourceLayouts.clear();
|
||||
|
||||
if (m_fallbackTextureView != nullptr) {
|
||||
m_fallbackTextureView->Shutdown();
|
||||
delete m_fallbackTextureView;
|
||||
m_fallbackTextureView = nullptr;
|
||||
}
|
||||
|
||||
DestroySkyboxResources();
|
||||
|
||||
if (m_fallbackTexture != nullptr) {
|
||||
m_fallbackTexture->Shutdown();
|
||||
delete m_fallbackTexture;
|
||||
m_fallbackTexture = nullptr;
|
||||
if (m_fallbackTextureCubeView != nullptr) {
|
||||
m_fallbackTextureCubeView->Shutdown();
|
||||
delete m_fallbackTextureCubeView;
|
||||
m_fallbackTextureCubeView = nullptr;
|
||||
}
|
||||
|
||||
if (m_fallbackTextureCube != nullptr) {
|
||||
m_fallbackTextureCube->Shutdown();
|
||||
delete m_fallbackTextureCube;
|
||||
m_fallbackTextureCube = nullptr;
|
||||
}
|
||||
|
||||
if (m_fallbackTexture2DView != nullptr) {
|
||||
m_fallbackTexture2DView->Shutdown();
|
||||
delete m_fallbackTexture2DView;
|
||||
m_fallbackTexture2DView = nullptr;
|
||||
}
|
||||
|
||||
if (m_fallbackTexture2D != nullptr) {
|
||||
m_fallbackTexture2D->Shutdown();
|
||||
delete m_fallbackTexture2D;
|
||||
m_fallbackTexture2D = nullptr;
|
||||
}
|
||||
|
||||
if (m_sampler != nullptr) {
|
||||
|
||||
Reference in New Issue
Block a user