Moved frame rendering from KRCamera to KRRenderGraph

This commit is contained in:
2025-04-10 01:09:36 -07:00
parent 5f286e185e
commit 8d8cfd2532
10 changed files with 22 additions and 221 deletions

View File

@@ -111,7 +111,7 @@ const char* KRPipeline::KRENGINE_PUSH_CONSTANT_NAMES[] = {
"fade_color", // PushConstant::fade_color
};
KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, KRRenderPass* renderPass, Vector2i viewport_size, Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector<KRShader*>& shaders, uint32_t vertexAttributes, ModelFormat modelFormat)
KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KRRenderPass* renderPass, Vector2i viewport_size, Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector<KRShader*>& shaders, uint32_t vertexAttributes, ModelFormat modelFormat)
: KRContextObject(context)
, m_deviceHandle(deviceHandle)
{

View File

@@ -214,7 +214,7 @@ class KRPipeline : public KRContextObject
{
public:
KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, KRRenderPass* renderPass, hydra::Vector2i viewport_size, hydra::Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector<KRShader*>& shaders, uint32_t vertexAttributes, ModelFormat modelFormat);
KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KRRenderPass* renderPass, hydra::Vector2i viewport_size, hydra::Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector<KRShader*>& shaders, uint32_t vertexAttributes, ModelFormat modelFormat);
virtual ~KRPipeline();
const char* getKey() const;

View File

@@ -84,7 +84,7 @@ KRPipeline* KRPipelineManager::getPipeline(KRSurface& surface, const PipelineInf
std::vector<KRShader*> shaders;
shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".vert", "spv"));
shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".frag", "spv"));
KRPipeline* pipeline = new KRPipeline(*m_pContext, surface.m_deviceHandle, surface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_OPAQUE), surface.getDimensions(), surface.getDimensions(), info, info.shader_name->c_str(), shaders, info.vertexAttributes, info.modelFormat);
KRPipeline* pipeline = new KRPipeline(*m_pContext, surface.m_deviceHandle, info.renderPass, surface.getDimensions(), surface.getDimensions(), info, info.shader_name->c_str(), shaders, info.vertexAttributes, info.modelFormat);
m_pipelines[key] = pipeline;

View File

@@ -32,6 +32,10 @@
#include "KRPresentationThread.h"
#include "KRRenderPass.h"
#include "KRSwapchain.h"
#include "KRRenderGraph.h"
#include "KRRenderGraphDeferred.h"
#include "KRRenderGraphForward.h"
#include "KRRenderGraphBlackFrame.h"
KRPresentationThread::KRPresentationThread(KRContext& context)
: KRContextObject(context)
@@ -161,9 +165,10 @@ void KRPresentationThread::renderFrame()
// TODO - This needs to be moved to the Render thread...
float deltaTime = 0.005; // TODO - Replace dummy value
if (scene) {
scene->renderFrame(commandBuffer, surface, deltaTime);
KRRenderGraphForward* renderGraph = surface.m_renderGraphForward.get();
scene->renderFrame(commandBuffer, surface, *renderGraph, deltaTime);
} else {
surface.renderBlackFrame(commandBuffer);
surface.m_renderGraphBlackFrame->render(commandBuffer, surface, nullptr);
}
if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) {

View File

@@ -249,22 +249,11 @@ VkFormat KRSurface::getDepthFormat() const
return m_swapChain->m_depthFormat;
}
KRRenderPass* KRSurface::getRenderPass(RenderPassType type)
{
return m_renderGraphForward->getRenderPass(type);
}
void KRSurface::endFrame()
{
m_frameIndex++;
}
void KRSurface::renderBlackFrame(VkCommandBuffer &commandBuffer)
{
m_renderGraphBlackFrame->render(commandBuffer, *this, nullptr);
}
VkFormat KRSurface::getSurfaceFormat() const
{
return m_surfaceFormat.format;

View File

@@ -53,7 +53,6 @@ public:
uint32_t getHeight() const;
hydra::Vector2i getDimensions() const;
VkFormat getDepthFormat() const;
void renderBlackFrame(VkCommandBuffer &commandBuffer);
VkFormat getSurfaceFormat() const;
KRSurface(const KRSurface&) = delete;
@@ -62,7 +61,6 @@ public:
KrResult initialize();
KrResult recreateSwapChain();
KRRenderPass* getRenderPass(RenderPassType type);
void endFrame();
KrSurfaceHandle m_handle;
@@ -83,6 +81,9 @@ public:
private:
void destroySwapChain();
KrResult createSwapChain();
public:
// TODO - These need to be relocated...
std::unique_ptr<KRRenderGraphForward> m_renderGraphForward;
std::unique_ptr<KRRenderGraphDeferred> m_renderGraphDeferred;
std::unique_ptr<KRRenderGraphBlackFrame> m_renderGraphBlackFrame;

View File

@@ -35,6 +35,7 @@
#include "KRRenderPass.h"
#include "KRPipeline.h"
#include "KRRenderPass.h"
#include "KRRenderGraph.h"
using namespace mimir;
using namespace hydra;
@@ -231,7 +232,7 @@ void KRCamera::render(KRNode::RenderInfo& ri)
}
}
void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface)
void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface, KRRenderGraph& renderGraph)
{
if (compositeSurface.m_handle != m_surfaceHandle) {
// Only render to the assigned surface
@@ -268,204 +269,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
m_viewport.expireOcclusionResults(getContext().getCurrentFrame());
// ----====---- Pre-stream resources ----====----
KRNode::RenderInfo ri(commandBuffer);
ri.camera = this;
ri.viewport = &m_viewport;
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PRESTREAM);
ri.surface = &compositeSurface;
render(ri);
// ----====---- Generate Shadowmaps for Lights ----====----
if (settings.m_cShadowBuffers > 0) {
GL_PUSH_GROUP_MARKER("Generate Shadowmaps");
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_SHADOWMAP);
render(ri);
GL_POP_GROUP_MARKER;
}
if (settings.bEnableDeferredLighting) {
// ----====---- Opaque Geometry, Deferred rendering Pass 1 ----====----
GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 1 (Opaque)");
// Start render pass
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_GBUFFER);
ri.renderPass->begin(commandBuffer, compositeSurface);
// Render the geometry
render(ri);
// End render pass
ri.renderPass->end(commandBuffer);
GL_POP_GROUP_MARKER;
// ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====----
GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 2 (Opaque)");
// Set render target
GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer));
GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0));
GLDEBUG(glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
GLDEBUG(glClear(GL_COLOR_BUFFER_BIT));
// Set source to buffers from pass 1
m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 6, compositeColorTexture);
m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 7, compositeDepthTexture);
// Render the geometry
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_LIGHTS);
ri.renderPass->begin(commandBuffer, compositeSurface);
render(ri);
ri.renderPass->end(commandBuffer);
GL_POP_GROUP_MARKER;
// ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====----
GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 3 (Opaque)");
// Start render pass
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_OPAQUE);
ri.renderPass->begin(commandBuffer, compositeSurface);
// Set source to buffers from pass 2
m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 6, lightAccumulationTexture);
// Render the geometry
// TODO: At this point, we only want to render octree nodes that produced fragments during the 1st pass into the GBuffer
render(ri);
// End render pass
ri.renderPass->end(commandBuffer);
GL_POP_GROUP_MARKER;
} else {
// ----====---- Opaque Geometry, Forward Rendering ----====----
GL_PUSH_GROUP_MARKER("Forward Rendering - Opaque");
// Start render pass
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_OPAQUE);
ri.renderPass->begin(commandBuffer, compositeSurface);
// Render the geometry
render(ri);
GL_POP_GROUP_MARKER;
ri.renderPass->end(commandBuffer);
}
// ----====---- Transparent Geometry, Forward Rendering ----====----
GL_PUSH_GROUP_MARKER("Forward Rendering - Transparent");
// Render all transparent geometry
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
ri.renderPass->begin(commandBuffer, compositeSurface);
render(ri);
ri.renderPass->end(commandBuffer);
GL_POP_GROUP_MARKER;
// ----====---- Particle Occlusion Tests ----====----
GL_PUSH_GROUP_MARKER("Particle Occlusion Tests");
// ----====---- Perform Occlusion Tests ----====----
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION);
if (ri.renderPass) {
ri.renderPass->begin(commandBuffer, compositeSurface);
render(ri);
ri.renderPass->end(commandBuffer);
}
GL_POP_GROUP_MARKER;
// ----====---- Flares ----====----
GL_PUSH_GROUP_MARKER("Additive Particles");
// Render all flares
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES);
if (ri.renderPass) {
ri.renderPass->begin(commandBuffer, compositeSurface);
render(ri);
ri.renderPass->end(commandBuffer);
}
GL_POP_GROUP_MARKER;
// ----====---- Volumetric Lighting ----====----
if (settings.volumetric_environment_enable) {
GL_PUSH_GROUP_MARKER("Volumetric Lighting");
KRViewport volumetricLightingViewport = KRViewport(Vector2::Create((float)volumetricBufferWidth, (float)volumetricBufferHeight), m_viewport.getViewMatrix(), m_viewport.getProjectionMatrix());
if (settings.volumetric_environment_downsample != 0) {
// Set render target
GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, volumetricLightAccumulationBuffer));
GLDEBUG(glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
GLDEBUG(glClear(GL_COLOR_BUFFER_BIT));
// Disable z-buffer test
GLDEBUG(glDisable(GL_DEPTH_TEST));
m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 0, compositeDepthTexture);
GLDEBUG(glViewport(0, 0, (int)volumetricLightingViewport.getSize().x, (int)volumetricLightingViewport.getSize().y));
} else {
// Enable z-buffer test
GLDEBUG(glEnable(GL_DEPTH_TEST));
GLDEBUG(glDepthFunc(GL_LEQUAL));
GLDEBUG(glDepthRangef(0.0, 1.0));
}
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE);
ri.viewport = &volumetricLightingViewport;
ri.renderPass->begin(commandBuffer, compositeSurface);
render(ri);
ri.renderPass->end(commandBuffer);
ri.viewport = &m_viewport;
GL_POP_GROUP_MARKER;
}
// ----====---- Debug Overlay ----====----
GL_PUSH_GROUP_MARKER("Debug Overlays");
GL_POP_GROUP_MARKER;
// fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i/%i Kbyte (active/total) Shader Handles: %i Visible Bounds: %i Max Texture LOD: %i\n", (int)m_pContext->getMeshManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getActiveMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024, (int)m_pContext->getPipelineManager()->getShaderHandlesUsed(), (int)m_visibleBounds.size(), m_pContext->getTextureManager()->getLODDimCap());
GL_PUSH_GROUP_MARKER("Debug Overlays");
GL_POP_GROUP_MARKER;
GL_PUSH_GROUP_MARKER("Post Processing");
KRRenderPass* postCompositePass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_POST_COMPOSITE);
postCompositePass->begin(commandBuffer, compositeSurface);
renderPost(ri);
postCompositePass->end(commandBuffer);
GL_POP_GROUP_MARKER;
renderGraph.render(commandBuffer, compositeSurface, this);
}

View File

@@ -47,6 +47,7 @@ class KRModel;
class KRScene;
class KRViewport;
class KRSurface;
class KRRenderGraph;
class KRCamera : public KRNode
{
@@ -57,7 +58,7 @@ public:
KrResult update(const KrNodeInfo* nodeInfo) override;
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface);
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface, KRRenderGraph& renderGraph);
void render(KRNode::RenderInfo& ri);

View File

@@ -57,7 +57,7 @@ KRScene::~KRScene()
m_pRootNode = NULL;
}
void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, float deltaTime)
void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, KRRenderGraph& renderGraph, float deltaTime)
{
getContext().startFrame(deltaTime);
KRCamera* camera = find<KRCamera>("default_camera");
@@ -74,7 +74,7 @@ void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, fl
getContext().getAudioManager()->setReverbMaxLength(camera->settings.siren_reverb_max_length);
getContext().getTextureManager()->setMaxAnisotropy(camera->settings.max_anisotropy);
camera->renderFrame(commandBuffer, surface);
camera->renderFrame(commandBuffer, surface, renderGraph);
getContext().endFrame(deltaTime);
physicsUpdate(deltaTime);
}

View File

@@ -45,6 +45,7 @@
class KRModel;
class KRLight;
class KRSurface;
class KRRenderGraph;
using std::vector;
@@ -70,7 +71,7 @@ public:
bool rayCast(const hydra::Vector3& v0, const hydra::Vector3& dir, hydra::HitInfo& hitinfo, unsigned int layer_mask);
bool sphereCast(const hydra::Vector3& v0, const hydra::Vector3& v1, float radius, hydra::HitInfo& hitinfo, unsigned int layer_mask);
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, float deltaTime);
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, KRRenderGraph& renderGraph, float deltaTime);
void render(KRNode::RenderInfo& ri);
void updateOctree(const KRViewport& viewport);