Moved frame rendering from KRCamera to KRRenderGraph
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user