Adding pretty printers
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include "Math/Matrix.h"
|
||||
#include "Math/Vector.h"
|
||||
#include "MinimalEngine.h"
|
||||
#include "ShadowPass.h"
|
||||
|
||||
using namespace Seele;
|
||||
|
||||
@@ -41,7 +42,29 @@ BasePass::BasePass(Gfx::PGraphics graphics, PScene scene) : RenderPass(graphics)
|
||||
});
|
||||
lightCullingLayout->create();
|
||||
|
||||
shadowMappingLayout = graphics->createDescriptorLayout("pShadowMapping");
|
||||
shadowMappingLayout->addDescriptorBinding(Gfx::DescriptorBinding{
|
||||
.name = SHADOWMAPS_NAME,
|
||||
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
|
||||
.descriptorCount = NUM_CASCADES,
|
||||
});
|
||||
shadowMappingLayout->addDescriptorBinding(Gfx::DescriptorBinding{
|
||||
.name = LIGHTSPACE_NAME,
|
||||
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
.descriptorCount = NUM_CASCADES,
|
||||
});
|
||||
shadowMappingLayout->addDescriptorBinding(Gfx::DescriptorBinding{
|
||||
.name = SHADOWSAMPLER_NAME,
|
||||
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_SAMPLER,
|
||||
});
|
||||
shadowMappingLayout->addDescriptorBinding(Gfx::DescriptorBinding{
|
||||
.name = CASCADE_SPLIT_NAME,
|
||||
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER
|
||||
});
|
||||
shadowMappingLayout->create();
|
||||
|
||||
basePassLayout->addDescriptorLayout(lightCullingLayout);
|
||||
basePassLayout->addDescriptorLayout(shadowMappingLayout);
|
||||
basePassLayout->addPushConstants(Gfx::SePushConstantRange{
|
||||
.stageFlags = Gfx::SE_SHADER_STAGE_TASK_BIT_EXT | Gfx::SE_SHADER_STAGE_VERTEX_BIT | Gfx::SE_SHADER_STAGE_FRAGMENT_BIT,
|
||||
.offset = 0,
|
||||
@@ -79,6 +102,19 @@ BasePass::BasePass(Gfx::PGraphics graphics, PScene scene) : RenderPass(graphics)
|
||||
.fogColor = Vector(0, 0, 0),
|
||||
.blendFactor = 0,
|
||||
};
|
||||
shadowSampler = graphics->createSampler(SamplerCreateInfo{
|
||||
.magFilter = Gfx::SE_FILTER_LINEAR,
|
||||
.minFilter = Gfx::SE_FILTER_LINEAR,
|
||||
.mipmapMode = Gfx::SE_SAMPLER_MIPMAP_MODE_LINEAR,
|
||||
.addressModeU = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||
.addressModeV = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||
.addressModeW = Gfx::SE_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||
.mipLodBias = 0.0f,
|
||||
.maxAnisotropy = 1.0f,
|
||||
.minLod = 0.0f,
|
||||
.maxLod = 1.0f,
|
||||
.borderColor = Gfx::SE_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
|
||||
});
|
||||
}
|
||||
|
||||
BasePass::~BasePass() {}
|
||||
@@ -139,13 +175,23 @@ void BasePass::render() {
|
||||
transparentCulling->updateTexture(LIGHTGRID_NAME, 0, tLightGrid->getDefaultView());
|
||||
opaqueCulling->writeChanges();
|
||||
transparentCulling->writeChanges();
|
||||
|
||||
shadowMappingLayout->reset();
|
||||
shadowMapping = shadowMappingLayout->allocateDescriptorSet();
|
||||
for (uint32 i = 0; i < NUM_CASCADES; ++i) {
|
||||
shadowMapping->updateTexture(SHADOWMAPS_NAME, i, shadowMaps[i]->getDefaultView());
|
||||
shadowMapping->updateBuffer(LIGHTSPACE_NAME, i, lightSpaceMatrices[i]);
|
||||
}
|
||||
shadowMapping->updateSampler(SHADOWSAMPLER_NAME, 0, shadowSampler);
|
||||
shadowMapping->updateBuffer(CASCADE_SPLIT_NAME, 0, cascadeSplits);
|
||||
shadowMapping->writeChanges();
|
||||
|
||||
query->beginQuery();
|
||||
timestamps->write(Gfx::SE_PIPELINE_STAGE_TOP_OF_PIPE_BIT, "BaseBegin");
|
||||
graphics->beginRenderPass(renderPass);
|
||||
Array<VertexData::TransparentDraw> transparentData;
|
||||
// Opaque
|
||||
{
|
||||
graphics->beginDebugRegion("Opaque");
|
||||
Array<Gfx::ORenderCommand> commands;
|
||||
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("BasePass");
|
||||
permutation.setDepthCulling(true); // always use the culling info
|
||||
@@ -176,7 +222,7 @@ void BasePass::render() {
|
||||
const Gfx::ShaderCollection* collection = graphics->getShaderCompiler()->findShaders(id);
|
||||
assert(collection != nullptr);
|
||||
|
||||
//bool twoSided = materialData.material->isTwoSided();
|
||||
// bool twoSided = materialData.material->isTwoSided();
|
||||
|
||||
if (graphics->supportMeshShading()) {
|
||||
Gfx::MeshPipelineCreateInfo pipelineInfo = {
|
||||
@@ -221,7 +267,7 @@ void BasePass::render() {
|
||||
command->bindPipeline(graphics->createGraphicsPipeline(std::move(pipelineInfo)));
|
||||
}
|
||||
command->bindDescriptor({viewParamsSet, vertexData->getVertexDataSet(), vertexData->getInstanceDataSet(),
|
||||
scene->getLightEnvironment()->getDescriptorSet(), Material::getDescriptorSet(), opaqueCulling});
|
||||
scene->getLightEnvironment()->getDescriptorSet(), Material::getDescriptorSet(), shadowMapping, opaqueCulling});
|
||||
for (const auto& drawCall : materialData.instances) {
|
||||
command->pushConstants(Gfx::SE_SHADER_STAGE_TASK_BIT_EXT | Gfx::SE_SHADER_STAGE_VERTEX_BIT |
|
||||
Gfx::SE_SHADER_STAGE_FRAGMENT_BIT,
|
||||
@@ -241,7 +287,6 @@ void BasePass::render() {
|
||||
}
|
||||
}
|
||||
graphics->executeCommands(std::move(commands));
|
||||
graphics->endDebugRegion();
|
||||
}
|
||||
|
||||
// commands.add(waterRenderer->render(viewParamsSet));
|
||||
@@ -249,18 +294,15 @@ void BasePass::render() {
|
||||
|
||||
// Skybox
|
||||
{
|
||||
graphics->beginDebugRegion("Skybox");
|
||||
Gfx::ORenderCommand skyboxCommand = graphics->createRenderCommand("SkyboxRender");
|
||||
skyboxCommand->setViewport(viewport);
|
||||
skyboxCommand->bindPipeline(skyboxPipeline);
|
||||
skyboxCommand->bindDescriptor({viewParamsSet, skyboxDataSet, textureSet});
|
||||
skyboxCommand->draw(36, 1, 0, 0);
|
||||
graphics->executeCommands(std::move(skyboxCommand));
|
||||
graphics->endDebugRegion();
|
||||
}
|
||||
// Transparent rendering
|
||||
{
|
||||
graphics->beginDebugRegion("Transparent");
|
||||
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("BasePass");
|
||||
permutation.setPositionOnly(false);
|
||||
permutation.setDepthCulling(false); // ignore visibility infos for transparency
|
||||
@@ -280,7 +322,7 @@ void BasePass::render() {
|
||||
const Gfx::ShaderCollection* collection = graphics->getShaderCompiler()->findShaders(id);
|
||||
assert(collection != nullptr);
|
||||
|
||||
//bool twoSided = t.matInst->getBaseMaterial()->isTwoSided();
|
||||
// bool twoSided = t.matInst->getBaseMaterial()->isTwoSided();
|
||||
|
||||
if (graphics->supportMeshShading()) {
|
||||
Gfx::MeshPipelineCreateInfo pipelineInfo = {
|
||||
@@ -343,7 +385,7 @@ void BasePass::render() {
|
||||
transparentCommand->bindPipeline(pipeline);
|
||||
}
|
||||
transparentCommand->bindDescriptor({viewParamsSet, t.vertexData->getVertexDataSet(), t.vertexData->getInstanceDataSet(),
|
||||
scene->getLightEnvironment()->getDescriptorSet(), Material::getDescriptorSet(),
|
||||
scene->getLightEnvironment()->getDescriptorSet(), Material::getDescriptorSet(), shadowMapping,
|
||||
transparentCulling});
|
||||
transparentCommand->pushConstants(Gfx::SE_SHADER_STAGE_TASK_BIT_EXT | Gfx::SE_SHADER_STAGE_VERTEX_BIT |
|
||||
Gfx::SE_SHADER_STAGE_FRAGMENT_BIT,
|
||||
@@ -360,11 +402,9 @@ void BasePass::render() {
|
||||
}
|
||||
}
|
||||
graphics->executeCommands(std::move(transparentCommand));
|
||||
graphics->endDebugRegion();
|
||||
}
|
||||
// Debug vertices
|
||||
if (gDebugVertices.size() > 0) {
|
||||
graphics->beginDebugRegion("Debug");
|
||||
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("BasePass");
|
||||
permutation.setDepthCulling(true); // always use the culling info
|
||||
permutation.setPositionOnly(false);
|
||||
@@ -375,7 +415,6 @@ void BasePass::render() {
|
||||
debugCommand->bindVertexBuffer({debugVertices});
|
||||
debugCommand->draw((uint32)gDebugVertices.size(), 1, 0, 0);
|
||||
graphics->executeCommands(std::move(debugCommand));
|
||||
graphics->endDebugRegion();
|
||||
}
|
||||
|
||||
graphics->endRenderPass();
|
||||
@@ -422,18 +461,18 @@ void BasePass::publishOutputs() {
|
||||
Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
Gfx::SE_ATTACHMENT_LOAD_OP_DONT_CARE, Gfx::SE_ATTACHMENT_STORE_OP_STORE);
|
||||
|
||||
msDepthAttachment =
|
||||
Gfx::RenderTargetAttachment(msBasePassDepth->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE);
|
||||
msDepthAttachment = Gfx::RenderTargetAttachment(msBasePassDepth->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED,
|
||||
Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR,
|
||||
Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE);
|
||||
msDepthAttachment.clear.depthStencil.depth = 0.0f;
|
||||
|
||||
colorAttachment =
|
||||
Gfx::RenderTargetAttachment(basePassColor->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
Gfx::SE_ATTACHMENT_LOAD_OP_DONT_CARE, Gfx::SE_ATTACHMENT_STORE_OP_STORE);
|
||||
colorAttachment = Gfx::RenderTargetAttachment(basePassColor->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED,
|
||||
Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_DONT_CARE,
|
||||
Gfx::SE_ATTACHMENT_STORE_OP_STORE);
|
||||
|
||||
msColorAttachment =
|
||||
Gfx::RenderTargetAttachment(msBasePassColor->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE);
|
||||
msColorAttachment = Gfx::RenderTargetAttachment(msBasePassColor->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED,
|
||||
Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR,
|
||||
Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE);
|
||||
msColorAttachment.clear.color.float32[0] = 0;
|
||||
msColorAttachment.clear.color.float32[1] = 1;
|
||||
msColorAttachment.clear.color.float32[2] = 0;
|
||||
@@ -452,6 +491,11 @@ void BasePass::createRenderPass() {
|
||||
// terrainRenderer = new TerrainRenderer(graphics, scene, viewParamsLayout, viewParamsSet);
|
||||
cullingBuffer = resources->requestBuffer("CULLINGBUFFER");
|
||||
timestamps = resources->requestTimestampQuery("TIMESTAMPS");
|
||||
for (uint32 i = 0; i < NUM_CASCADES; ++i) {
|
||||
shadowMaps[i] = resources->requestTexture(fmt::format("SHADOWMAP_TEXTURE{0}", i));
|
||||
lightSpaceMatrices[i] = resources->requestBuffer(fmt::format("SHADOWMAP_LIGHTSPACE{0}", i));
|
||||
}
|
||||
cascadeSplits = resources->requestUniform("SHADOWMAP_CASCADESPLITS");
|
||||
|
||||
Gfx::RenderTargetLayout layout = Gfx::RenderTargetLayout{
|
||||
.colorAttachments = {msColorAttachment},
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#pragma once
|
||||
#include "Graphics/Buffer.h"
|
||||
#include "Graphics/Descriptor.h"
|
||||
#include "Graphics/RenderPass/ShadowPass.h"
|
||||
#include "MinimalEngine.h"
|
||||
#include "RenderPass.h"
|
||||
#include "WaterRenderer.h"
|
||||
|
||||
namespace Seele {
|
||||
DECLARE_REF(CameraActor)
|
||||
@@ -30,9 +32,14 @@ class BasePass : public RenderPass {
|
||||
Gfx::PTexture2D tLightGrid;
|
||||
constexpr static const char* LIGHTINDEX_NAME = "lightIndexList";
|
||||
constexpr static const char* LIGHTGRID_NAME = "lightGrid";
|
||||
constexpr static const char* SHADOWMAPS_NAME = "shadowMaps";
|
||||
constexpr static const char* LIGHTSPACE_NAME = "lightSpaceMatrices";
|
||||
constexpr static const char* SHADOWSAMPLER_NAME = "shadowSampler";
|
||||
constexpr static const char* CASCADE_SPLIT_NAME = "cascadeSplit";
|
||||
|
||||
Gfx::PDescriptorSet opaqueCulling;
|
||||
Gfx::PDescriptorSet transparentCulling;
|
||||
Gfx::PDescriptorSet shadowMapping;
|
||||
|
||||
// use a different texture here so we can do multisampling
|
||||
Gfx::OTexture2D msBasePassDepth;
|
||||
@@ -49,6 +56,7 @@ class BasePass : public RenderPass {
|
||||
PCameraActor source;
|
||||
Gfx::OPipelineLayout basePassLayout;
|
||||
Gfx::ODescriptorLayout lightCullingLayout;
|
||||
Gfx::ODescriptorLayout shadowMappingLayout;
|
||||
|
||||
Gfx::OPipelineStatisticsQuery query;
|
||||
Gfx::PTimestampQuery timestamps;
|
||||
@@ -58,6 +66,12 @@ class BasePass : public RenderPass {
|
||||
//OWaterRenderer waterRenderer;
|
||||
//OTerrainRenderer terrainRenderer;
|
||||
|
||||
// Shadow mapping
|
||||
Gfx::PTexture2D shadowMaps[NUM_CASCADES];
|
||||
Gfx::PShaderBuffer lightSpaceMatrices[NUM_CASCADES];
|
||||
Gfx::OSampler shadowSampler;
|
||||
Gfx::PUniformBuffer cascadeSplits;
|
||||
|
||||
// Debug rendering
|
||||
Gfx::OVertexInput debugVertexInput;
|
||||
Gfx::OVertexBuffer debugVertices;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "RenderGraphResources.h"
|
||||
#include "Graphics/Query.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
using namespace Seele;
|
||||
|
||||
@@ -44,7 +44,6 @@ ShadowPass::ShadowPass(Gfx::PGraphics graphics, PScene scene) : RenderPass(graph
|
||||
ShadowPass::~ShadowPass() {}
|
||||
|
||||
void ShadowPass::beginFrame(const Component::Camera& camera, const Component::Transform& transform) {
|
||||
uint32 cascadeDim = SHADOW_MAP_SIZE;
|
||||
float cascadeSplits[NUM_CASCADES];
|
||||
|
||||
float nearClip = camera.nearPlane;
|
||||
@@ -58,19 +57,6 @@ void ShadowPass::beginFrame(const Component::Camera& camera, const Component::Tr
|
||||
float ratio = maxZ / minZ;
|
||||
constexpr float cascadeSplitLambda = 0.95f;
|
||||
for (uint32 i = 0; i < NUM_CASCADES; ++i) {
|
||||
cascades[i].shadowMaps = graphics->createTexture2D(TextureCreateInfo{
|
||||
.format = Gfx::SE_FORMAT_D32_SFLOAT,
|
||||
.width = cascadeDim,
|
||||
.height = cascadeDim,
|
||||
.elements = (uint32)scene->getLightEnvironment()->getNumDirectionalLights(),
|
||||
.usage = Gfx::SE_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | Gfx::SE_IMAGE_USAGE_SAMPLED_BIT,
|
||||
.name = "ShadowMapCascade",
|
||||
});
|
||||
cascades[i].views.clear();
|
||||
for (uint32 j = 0; j < cascades[i].shadowMaps->getNumLayers(); ++j) {
|
||||
cascades[i].views.add(cascades[i].shadowMaps->createTextureView(0, 1, j, 1));
|
||||
}
|
||||
cascadeDim /= 2;
|
||||
float p = (i + 1) / static_cast<float>(NUM_CASCADES);
|
||||
float log = minZ * std::pow(ratio, p);
|
||||
float uniform = minZ + range * p;
|
||||
@@ -131,6 +117,8 @@ void ShadowPass::beginFrame(const Component::Camera& camera, const Component::Tr
|
||||
viewParams.screenDimensions = Vector2(maxExtents.x - minExtents.x, maxExtents.y - minExtents.y);
|
||||
viewParams.invScreenDimensions = 1.0f / viewParams.screenDimensions;
|
||||
cascades[i].viewParams.add(createViewParamsSet());
|
||||
|
||||
lastSplitDist = cascadeSplits[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -146,9 +134,9 @@ void ShadowPass::render() {
|
||||
Array<Gfx::ORenderCommand> commands;
|
||||
renderPass = graphics->createRenderPass(
|
||||
Gfx::RenderTargetLayout{
|
||||
.depthAttachment = Gfx::RenderTargetAttachment(
|
||||
cascades[c].views[shadowIndex], Gfx::SE_IMAGE_LAYOUT_UNDEFINED,
|
||||
Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE),
|
||||
.depthAttachment = Gfx::RenderTargetAttachment(cascades[c].views[shadowIndex], Gfx::SE_IMAGE_LAYOUT_UNDEFINED,
|
||||
Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE),
|
||||
|
||||
},
|
||||
{
|
||||
@@ -219,7 +207,8 @@ void ShadowPass::render() {
|
||||
Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo));
|
||||
command->bindPipeline(pipeline);
|
||||
}
|
||||
command->bindDescriptor({cascades[c].viewParams[shadowIndex], vertexData->getVertexDataSet(), vertexData->getInstanceDataSet()});
|
||||
command->bindDescriptor(
|
||||
{cascades[c].viewParams[shadowIndex], vertexData->getVertexDataSet(), vertexData->getInstanceDataSet()});
|
||||
VertexData::DrawCallOffsets offsets = {
|
||||
.instanceOffset = 0,
|
||||
};
|
||||
@@ -258,6 +247,12 @@ void ShadowPass::render() {
|
||||
void ShadowPass::endFrame() {}
|
||||
|
||||
void ShadowPass::publishOutputs() {
|
||||
cascadeSplitsBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{.sourceData =
|
||||
{
|
||||
.size = sizeof(float) * NUM_CASCADES,
|
||||
.data = nullptr,
|
||||
},
|
||||
.name = "CascadeSplits"});
|
||||
shadowViewport = graphics->createViewport(nullptr, ViewportCreateInfo{.dimensions =
|
||||
{
|
||||
.size = {SHADOW_MAP_SIZE, SHADOW_MAP_SIZE},
|
||||
@@ -268,6 +263,39 @@ void ShadowPass::publishOutputs() {
|
||||
.right = 100,
|
||||
.top = 100,
|
||||
.bottom = -100});
|
||||
uint32 cascadeDim = SHADOW_MAP_SIZE;
|
||||
for (uint32 s = 0; s < NUM_CASCADES; ++s) {
|
||||
cascades[s].shadowMaps = graphics->createTexture2DArray(TextureCreateInfo{
|
||||
.format = Gfx::SE_FORMAT_D32_SFLOAT,
|
||||
.width = cascadeDim,
|
||||
.height = cascadeDim,
|
||||
.elements = 1, // TODO:
|
||||
.usage = Gfx::SE_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | Gfx::SE_IMAGE_USAGE_SAMPLED_BIT,
|
||||
.name = "ShadowMapCascade",
|
||||
});
|
||||
cascades[s].lightSpaceBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
|
||||
.sourceData = {
|
||||
.size = sizeof(Matrix4),
|
||||
.data = nullptr,
|
||||
},
|
||||
.name = "LightSpaceBuffer"
|
||||
});
|
||||
cascades[s].views.clear();
|
||||
for (uint32 j = 0; j < cascades[s].shadowMaps->getNumLayers(); ++j) {
|
||||
cascades[s].views.add(cascades[s].shadowMaps->createTextureView(0, 1, j, 1));
|
||||
}
|
||||
cascadeDim /= 2;
|
||||
resources->registerTextureOutput(fmt::format("SHADOWMAP_TEXTURE{0}", s), Gfx::PTexture2DArray(cascades[s].shadowMaps));
|
||||
resources->registerBufferOutput(fmt::format("SHADOWMAP_LIGHTSPACE{0}", s), cascades[s].lightSpaceBuffer);
|
||||
}
|
||||
cascadeSplitsBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
|
||||
.sourceData = {
|
||||
.size = sizeof(float) * NUM_CASCADES,
|
||||
.data = nullptr,
|
||||
},
|
||||
.name = "CASCADE_SPLITS"
|
||||
});
|
||||
resources->registerUniformOutput("SHADOWMAP_CASCADESPLITS", cascadeSplitsBuffer);
|
||||
viewport = shadowViewport;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
namespace Seele {
|
||||
|
||||
static constexpr uint64 SHADOW_MAP_SIZE = 8192;
|
||||
static constexpr uint64 NUM_CASCADES = 4;
|
||||
|
||||
class ShadowPass : public RenderPass {
|
||||
public:
|
||||
@@ -20,13 +21,15 @@ class ShadowPass : public RenderPass {
|
||||
virtual void createRenderPass() override;
|
||||
private:
|
||||
AABB cameraFrustumBox;
|
||||
static constexpr uint64 NUM_CASCADES = 4;
|
||||
struct Cascade {
|
||||
Gfx::OTexture2D shadowMaps;
|
||||
Gfx::OTexture2DArray shadowMaps;
|
||||
Array<Gfx::OTextureView> views;
|
||||
Array<Matrix4> lightSpaceMatrices;
|
||||
Gfx::OShaderBuffer lightSpaceBuffer;
|
||||
Array<Gfx::PDescriptorSet> viewParams;
|
||||
};
|
||||
StaticArray<Cascade, NUM_CASCADES> cascades;
|
||||
Gfx::OUniformBuffer cascadeSplitsBuffer;
|
||||
Gfx::OPipelineLayout shadowLayout;
|
||||
Gfx::PShaderBuffer cullingBuffer;
|
||||
Gfx::OViewport shadowViewport;
|
||||
|
||||
Reference in New Issue
Block a user