Add forward shadow receiving support
This commit is contained in:
@@ -19,6 +19,7 @@ namespace {
|
||||
struct OwnedShadowSurfaceResources {
|
||||
RHI::RHITexture* depthTexture = nullptr;
|
||||
RHI::RHIResourceView* depthView = nullptr;
|
||||
RHI::RHIResourceView* shaderView = nullptr;
|
||||
RenderSurface surface = {};
|
||||
|
||||
OwnedShadowSurfaceResources() = default;
|
||||
@@ -30,6 +31,12 @@ struct OwnedShadowSurfaceResources {
|
||||
}
|
||||
|
||||
void Reset() {
|
||||
if (shaderView != nullptr) {
|
||||
shaderView->Shutdown();
|
||||
delete shaderView;
|
||||
shaderView = nullptr;
|
||||
}
|
||||
|
||||
if (depthView != nullptr) {
|
||||
depthView->Shutdown();
|
||||
delete depthView;
|
||||
@@ -181,14 +188,48 @@ bool CreateDirectionalShadowSurface(
|
||||
return false;
|
||||
}
|
||||
|
||||
RHI::ResourceViewDesc shaderViewDesc = {};
|
||||
shaderViewDesc.format = depthDesc.format;
|
||||
shaderViewDesc.dimension = RHI::ResourceViewDimension::Texture2D;
|
||||
shaderViewDesc.mipLevel = 0;
|
||||
RHI::RHIResourceView* shaderView =
|
||||
context.device->CreateShaderResourceView(depthTexture, shaderViewDesc);
|
||||
if (shaderView == nullptr) {
|
||||
depthView->Shutdown();
|
||||
delete depthView;
|
||||
depthTexture->Shutdown();
|
||||
delete depthTexture;
|
||||
return false;
|
||||
}
|
||||
|
||||
outResources.Reset();
|
||||
outResources.depthTexture = depthTexture;
|
||||
outResources.depthView = depthView;
|
||||
outResources.shaderView = shaderView;
|
||||
outResources.surface = RenderSurface(plan.mapWidth, plan.mapHeight);
|
||||
outResources.surface.SetDepthAttachment(depthView);
|
||||
return true;
|
||||
}
|
||||
|
||||
RenderDirectionalShadowData BuildDirectionalShadowData(
|
||||
const DirectionalShadowRenderPlan& plan,
|
||||
RHI::RHIResourceView* shadowMapView) {
|
||||
RenderDirectionalShadowData shadowData = {};
|
||||
if (!plan.IsValid() || shadowMapView == nullptr) {
|
||||
return shadowData;
|
||||
}
|
||||
|
||||
shadowData.enabled = true;
|
||||
shadowData.viewProjection = plan.cameraData.viewProjection;
|
||||
shadowData.shadowMap = shadowMapView;
|
||||
shadowData.shadowParams = Math::Vector4(
|
||||
0.0015f,
|
||||
1.0f / static_cast<float>(plan.mapWidth),
|
||||
1.0f / static_cast<float>(plan.mapHeight),
|
||||
0.85f);
|
||||
return shadowData;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
CameraRenderer::CameraRenderer()
|
||||
@@ -351,6 +392,12 @@ bool CameraRenderer::Render(
|
||||
return false;
|
||||
}
|
||||
|
||||
if (request.directionalShadow.IsValid()) {
|
||||
RHI::RHIResourceView* shadowMapView = ownedShadowSurface.shaderView;
|
||||
sceneData.lighting.mainDirectionalShadow =
|
||||
BuildDirectionalShadowData(request.directionalShadow, shadowMapView);
|
||||
}
|
||||
|
||||
sceneData.cameraData.clearFlags = request.clearFlags;
|
||||
if (request.hasClearColorOverride) {
|
||||
sceneData.cameraData.clearColor = request.clearColorOverride;
|
||||
|
||||
Reference in New Issue
Block a user