WIP Refactoring to move frame rendering from KRCamera to KRRenderGraph
This commit is contained in:
@@ -157,10 +157,23 @@ KRRenderPass* KRRenderGraph::getFinalRenderPass()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KRRenderGraph::render(VkCommandBuffer &commandBuffer, KRSurface& surface, KRScene* scene)
|
void KRRenderGraph::render(VkCommandBuffer &commandBuffer, KRSurface& surface, KRCamera* camera)
|
||||||
{
|
{
|
||||||
|
KRNode::RenderInfo ri(commandBuffer);
|
||||||
|
ri.camera = camera;
|
||||||
|
if (camera) {
|
||||||
|
ri.viewport = camera->getViewport();
|
||||||
|
} else {
|
||||||
|
ri.viewport = nullptr;
|
||||||
|
}
|
||||||
|
ri.surface = &surface;
|
||||||
|
|
||||||
for(KRRenderPass* pass : m_renderPasses) {
|
for(KRRenderPass* pass : m_renderPasses) {
|
||||||
|
ri.renderPass = pass;
|
||||||
pass->begin(commandBuffer, surface);
|
pass->begin(commandBuffer, surface);
|
||||||
|
if (camera) {
|
||||||
|
camera->render(ri);
|
||||||
|
}
|
||||||
pass->end(commandBuffer);
|
pass->end(commandBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
void addRenderPass(KRDevice& device, const RenderPassInfo& info);
|
void addRenderPass(KRDevice& device, const RenderPassInfo& info);
|
||||||
KRRenderPass* getRenderPass(RenderPassType type);
|
KRRenderPass* getRenderPass(RenderPassType type);
|
||||||
KRRenderPass* getFinalRenderPass();
|
KRRenderPass* getFinalRenderPass();
|
||||||
void render(VkCommandBuffer &commandBuffer, KRSurface& surface, KRScene* scene);
|
void render(VkCommandBuffer &commandBuffer, KRSurface& surface, KRCamera* camera);
|
||||||
void destroy(KRDevice& device);
|
void destroy(KRDevice& device);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -161,6 +161,24 @@ KrResult KRRenderGraphDeferred::initialize(KRSurface &surface)
|
|||||||
#endif
|
#endif
|
||||||
addRenderPass(*surface.getDevice(), info);
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Particle Occlusion", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Additive Particles", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Additive Volumetric Effects", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
info.type = RenderPassType::RENDER_PASS_DEBUG_OVERLAYS;
|
info.type = RenderPassType::RENDER_PASS_DEBUG_OVERLAYS;
|
||||||
#if KRENGINE_DEBUG_GPU_LABELS
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
strncpy(info.debugLabel, "Debug Overlays", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
strncpy(info.debugLabel, "Debug Overlays", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
|||||||
@@ -130,6 +130,24 @@ KrResult KRRenderGraphForward::initialize(KRSurface &surface)
|
|||||||
#endif
|
#endif
|
||||||
addRenderPass(*surface.getDevice(), info);
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Particle Occlusion", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Additive Particles", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
|
info.type = RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE;
|
||||||
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
|
strncpy(info.debugLabel, "Additive Volumetric Effects", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
#endif
|
||||||
|
addRenderPass(*surface.getDevice(), info);
|
||||||
|
|
||||||
info.type = RenderPassType::RENDER_PASS_DEBUG_OVERLAYS;
|
info.type = RenderPassType::RENDER_PASS_DEBUG_OVERLAYS;
|
||||||
#if KRENGINE_DEBUG_GPU_LABELS
|
#if KRENGINE_DEBUG_GPU_LABELS
|
||||||
strncpy(info.debugLabel, "Debug Overlays", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
strncpy(info.debugLabel, "Debug Overlays", KRENGINE_DEBUG_GPU_LABEL_MAX_LEN);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ KRSurface::KRSurface(KRContext& context, KrSurfaceHandle handle, void* platformH
|
|||||||
, m_frameIndex(0)
|
, m_frameIndex(0)
|
||||||
, m_renderGraphForward(std::make_unique<KRRenderGraphForward>(context))
|
, m_renderGraphForward(std::make_unique<KRRenderGraphForward>(context))
|
||||||
, m_renderGraphDeferred(std::make_unique<KRRenderGraphDeferred>(context))
|
, m_renderGraphDeferred(std::make_unique<KRRenderGraphDeferred>(context))
|
||||||
, m_blackFrameRenderGraph(std::make_unique<KRRenderGraphBlackFrame>(context))
|
, m_renderGraphBlackFrame(std::make_unique<KRRenderGraphBlackFrame>(context))
|
||||||
, m_swapChain(std::make_unique<KRSwapchain>(context))
|
, m_swapChain(std::make_unique<KRSwapchain>(context))
|
||||||
, m_surfaceFormat{}
|
, m_surfaceFormat{}
|
||||||
{
|
{
|
||||||
@@ -118,7 +118,7 @@ void KRSurface::destroy()
|
|||||||
std::unique_ptr<KRDevice>& device = m_pContext->getDeviceManager()->getDevice(m_deviceHandle);
|
std::unique_ptr<KRDevice>& device = m_pContext->getDeviceManager()->getDevice(m_deviceHandle);
|
||||||
m_renderGraphForward->destroy(*device);
|
m_renderGraphForward->destroy(*device);
|
||||||
m_renderGraphDeferred->destroy(*device);
|
m_renderGraphDeferred->destroy(*device);
|
||||||
m_blackFrameRenderGraph->destroy(*device);
|
m_renderGraphBlackFrame->destroy(*device);
|
||||||
|
|
||||||
for (int i=0; i < KRENGINE_MAX_FRAMES_IN_FLIGHT; i++) {
|
for (int i=0; i < KRENGINE_MAX_FRAMES_IN_FLIGHT; i++) {
|
||||||
if (device && m_renderFinishedSemaphores[i] != VK_NULL_HANDLE) {
|
if (device && m_renderFinishedSemaphores[i] != VK_NULL_HANDLE) {
|
||||||
@@ -180,7 +180,7 @@ KrResult KRSurface::createSwapChain()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
res = m_blackFrameRenderGraph->initialize(*this);
|
res = m_renderGraphBlackFrame->initialize(*this);
|
||||||
if (res != KR_SUCCESS) {
|
if (res != KR_SUCCESS) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -262,7 +262,7 @@ void KRSurface::endFrame()
|
|||||||
|
|
||||||
void KRSurface::renderBlackFrame(VkCommandBuffer &commandBuffer)
|
void KRSurface::renderBlackFrame(VkCommandBuffer &commandBuffer)
|
||||||
{
|
{
|
||||||
m_blackFrameRenderGraph->render(commandBuffer, *this, nullptr);
|
m_renderGraphBlackFrame->render(commandBuffer, *this, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkFormat KRSurface::getSurfaceFormat() const
|
VkFormat KRSurface::getSurfaceFormat() const
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ private:
|
|||||||
KrResult createSwapChain();
|
KrResult createSwapChain();
|
||||||
std::unique_ptr<KRRenderGraphForward> m_renderGraphForward;
|
std::unique_ptr<KRRenderGraphForward> m_renderGraphForward;
|
||||||
std::unique_ptr<KRRenderGraphDeferred> m_renderGraphDeferred;
|
std::unique_ptr<KRRenderGraphDeferred> m_renderGraphDeferred;
|
||||||
std::unique_ptr<KRRenderGraphBlackFrame> m_blackFrameRenderGraph;
|
std::unique_ptr<KRRenderGraphBlackFrame> m_renderGraphBlackFrame;
|
||||||
|
|
||||||
VkSurfaceFormatKHR m_surfaceFormat;
|
VkSurfaceFormatKHR m_surfaceFormat;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -145,6 +145,92 @@ const std::string KRCamera::getSkyBox() const
|
|||||||
return m_skyBox;
|
return m_skyBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KRCamera::render(KRNode::RenderInfo& ri)
|
||||||
|
{
|
||||||
|
KRScene& scene = getScene();
|
||||||
|
|
||||||
|
switch (ri.renderPass->getType()) {
|
||||||
|
case RenderPassType::RENDER_PASS_FORWARD_OPAQUE:
|
||||||
|
{
|
||||||
|
// ----====---- Sky Box ----====----
|
||||||
|
|
||||||
|
GL_PUSH_GROUP_MARKER("Sky Box");
|
||||||
|
|
||||||
|
if (!m_pSkyBoxTexture && m_skyBox.length()) {
|
||||||
|
m_pSkyBoxTexture = getContext().getTextureManager()->getTextureCube(m_skyBox.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pSkyBoxTexture) {
|
||||||
|
m_pSkyBoxTexture->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SKY_CUBE);
|
||||||
|
|
||||||
|
std::string shader_name("sky_box");
|
||||||
|
PipelineInfo info{};
|
||||||
|
info.shader_name = &shader_name;
|
||||||
|
info.pCamera = this;
|
||||||
|
info.renderPass = ri.renderPass;
|
||||||
|
info.rasterMode = RasterMode::kOpaqueNoDepthWrite;
|
||||||
|
info.cullMode = CullMode::kCullNone;
|
||||||
|
|
||||||
|
KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
|
pPipeline->setImageBinding("diffuseTexture", m_pSkyBoxTexture, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER);
|
||||||
|
pPipeline->bind(ri, Matrix4());
|
||||||
|
|
||||||
|
// Render a full screen quad
|
||||||
|
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f);
|
||||||
|
vkCmdDraw(ri.commandBuffer, 4, 1, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
GL_POP_GROUP_MARKER;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RenderPassType::RENDER_PASS_DEBUG_OVERLAYS:
|
||||||
|
{
|
||||||
|
// ----====---- Debug Overlays ----====----
|
||||||
|
|
||||||
|
if (settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) {
|
||||||
|
KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES;
|
||||||
|
|
||||||
|
PipelineInfo info{};
|
||||||
|
std::string shader_name("visualize_overlay");
|
||||||
|
info.shader_name = &shader_name;
|
||||||
|
info.pCamera = this;
|
||||||
|
info.renderPass = ri.renderPass;
|
||||||
|
info.rasterMode = RasterMode::kAdditive;
|
||||||
|
info.vertexAttributes = vertices.getVertexAttributes();
|
||||||
|
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP;
|
||||||
|
KRPipeline* pVisShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
|
|
||||||
|
|
||||||
|
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &vertices, 1.0f);
|
||||||
|
for (unordered_map<AABB, int>::iterator itr = m_viewport.getVisibleBounds().begin(); itr != m_viewport.getVisibleBounds().end(); itr++) {
|
||||||
|
Matrix4 matModel = Matrix4();
|
||||||
|
matModel.scale((*itr).first.size() * 0.5f);
|
||||||
|
matModel.translate((*itr).first.center());
|
||||||
|
pVisShader->bind(ri, matModel);
|
||||||
|
vkCmdDraw(ri.commandBuffer, 14, 1, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderDebug(ri);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RenderPassType::RENDER_PASS_POST_COMPOSITE:
|
||||||
|
{
|
||||||
|
renderPost(ri);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
scene.render(ri);
|
||||||
|
|
||||||
|
switch (ri.renderPass->getType()) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface)
|
void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface)
|
||||||
{
|
{
|
||||||
if (compositeSurface.m_handle != m_surfaceHandle) {
|
if (compositeSurface.m_handle != m_surfaceHandle) {
|
||||||
@@ -189,13 +275,13 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PRESTREAM);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PRESTREAM);
|
||||||
ri.surface = &compositeSurface;
|
ri.surface = &compositeSurface;
|
||||||
|
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
|
|
||||||
// ----====---- Generate Shadowmaps for Lights ----====----
|
// ----====---- Generate Shadowmaps for Lights ----====----
|
||||||
if (settings.m_cShadowBuffers > 0) {
|
if (settings.m_cShadowBuffers > 0) {
|
||||||
GL_PUSH_GROUP_MARKER("Generate Shadowmaps");
|
GL_PUSH_GROUP_MARKER("Generate Shadowmaps");
|
||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_SHADOWMAP);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_SHADOWMAP);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +296,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
|
|
||||||
// Render the geometry
|
// Render the geometry
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
|
|
||||||
// End render pass
|
// End render pass
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
@@ -236,7 +322,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
// Render the geometry
|
// Render the geometry
|
||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_LIGHTS);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_LIGHTS);
|
||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
@@ -254,7 +340,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
|
|
||||||
// Render the geometry
|
// Render the geometry
|
||||||
// TODO: At this point, we only want to render octree nodes that produced fragments during the 1st pass into the GBuffer
|
// TODO: At this point, we only want to render octree nodes that produced fragments during the 1st pass into the GBuffer
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
|
|
||||||
// End render pass
|
// End render pass
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
@@ -269,44 +355,14 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
|
|
||||||
// Render the geometry
|
// Render the geometry
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
|
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----====---- Sky Box ----====----
|
|
||||||
|
|
||||||
GL_PUSH_GROUP_MARKER("Sky Box");
|
|
||||||
|
|
||||||
if (!m_pSkyBoxTexture && m_skyBox.length()) {
|
|
||||||
m_pSkyBoxTexture = getContext().getTextureManager()->getTextureCube(m_skyBox.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_pSkyBoxTexture) {
|
|
||||||
m_pSkyBoxTexture->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SKY_CUBE);
|
|
||||||
|
|
||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_OPAQUE);
|
|
||||||
|
|
||||||
std::string shader_name("sky_box");
|
|
||||||
PipelineInfo info{};
|
|
||||||
info.shader_name = &shader_name;
|
|
||||||
info.pCamera = this;
|
|
||||||
info.renderPass = ri.renderPass;
|
|
||||||
info.rasterMode = RasterMode::kOpaqueNoDepthWrite;
|
|
||||||
info.cullMode = CullMode::kCullNone;
|
|
||||||
|
|
||||||
KRPipeline* pPipeline = getContext().getPipelineManager()->getPipeline(compositeSurface, info);
|
|
||||||
pPipeline->setImageBinding("diffuseTexture", m_pSkyBoxTexture, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER);
|
|
||||||
pPipeline->bind(ri, Matrix4());
|
|
||||||
|
|
||||||
// Render a full screen quad
|
|
||||||
m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f);
|
|
||||||
vkCmdDraw(commandBuffer, 4, 1, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
|
||||||
|
|
||||||
|
|
||||||
// ----====---- Transparent Geometry, Forward Rendering ----====----
|
// ----====---- Transparent Geometry, Forward Rendering ----====----
|
||||||
@@ -316,7 +372,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
// Render all transparent geometry
|
// Render all transparent geometry
|
||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
|
|
||||||
@@ -328,7 +384,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION);
|
||||||
if (ri.renderPass) {
|
if (ri.renderPass) {
|
||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,7 +398,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES);
|
||||||
if (ri.renderPass) {
|
if (ri.renderPass) {
|
||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,7 +433,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE);
|
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE);
|
||||||
ri.viewport = &volumetricLightingViewport;
|
ri.viewport = &volumetricLightingViewport;
|
||||||
ri.renderPass->begin(commandBuffer, compositeSurface);
|
ri.renderPass->begin(commandBuffer, compositeSurface);
|
||||||
scene.render(ri);
|
render(ri);
|
||||||
ri.renderPass->end(commandBuffer);
|
ri.renderPass->end(commandBuffer);
|
||||||
ri.viewport = &m_viewport;
|
ri.viewport = &m_viewport;
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
@@ -389,38 +445,12 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
|
|
||||||
GL_PUSH_GROUP_MARKER("Debug Overlays");
|
GL_PUSH_GROUP_MARKER("Debug Overlays");
|
||||||
|
|
||||||
if (settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) {
|
|
||||||
KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES;
|
|
||||||
|
|
||||||
ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
|
|
||||||
|
|
||||||
PipelineInfo info{};
|
|
||||||
std::string shader_name("visualize_overlay");
|
|
||||||
info.shader_name = &shader_name;
|
|
||||||
info.pCamera = this;
|
|
||||||
info.renderPass = ri.renderPass;
|
|
||||||
info.rasterMode = RasterMode::kAdditive;
|
|
||||||
info.vertexAttributes = vertices.getVertexAttributes();
|
|
||||||
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_STRIP;
|
|
||||||
KRPipeline* pVisShader = getContext().getPipelineManager()->getPipeline(compositeSurface, info);
|
|
||||||
|
|
||||||
|
|
||||||
m_pContext->getMeshManager()->bindVBO(commandBuffer, &vertices, 1.0f);
|
|
||||||
for (unordered_map<AABB, int>::iterator itr = m_viewport.getVisibleBounds().begin(); itr != m_viewport.getVisibleBounds().end(); itr++) {
|
|
||||||
Matrix4 matModel = Matrix4();
|
|
||||||
matModel.scale((*itr).first.size() * 0.5f);
|
|
||||||
matModel.translate((*itr).first.center());
|
|
||||||
pVisShader->bind(ri,matModel);
|
|
||||||
vkCmdDraw(commandBuffer, 14, 1, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GL_POP_GROUP_MARKER;
|
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());
|
// 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_PUSH_GROUP_MARKER("Debug Overlays");
|
||||||
|
|
||||||
renderDebug(commandBuffer, compositeSurface);
|
|
||||||
|
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
@@ -430,7 +460,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
KRRenderPass* postCompositePass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_POST_COMPOSITE);
|
KRRenderPass* postCompositePass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_POST_COMPOSITE);
|
||||||
postCompositePass->begin(commandBuffer, compositeSurface);
|
postCompositePass->begin(commandBuffer, compositeSurface);
|
||||||
|
|
||||||
renderPost(commandBuffer, compositeSurface);
|
renderPost(ri);
|
||||||
|
|
||||||
postCompositePass->end(commandBuffer);
|
postCompositePass->end(commandBuffer);
|
||||||
|
|
||||||
@@ -597,7 +627,7 @@ void KRCamera::destroyBuffers()
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
void KRCamera::renderPost(RenderInfo& ri)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
// TODO - Re-enable once post fx shader is converted for Vulkan
|
// TODO - Re-enable once post fx shader is converted for Vulkan
|
||||||
@@ -659,7 +689,7 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KRCamera::renderDebug(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
void KRCamera::renderDebug(RenderInfo& ri)
|
||||||
{
|
{
|
||||||
const char* szText = settings.m_debug_text.c_str();
|
const char* szText = settings.m_debug_text.c_str();
|
||||||
|
|
||||||
@@ -785,10 +815,8 @@ void KRCamera::renderDebug(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_debug_text_vbo_data.load(commandBuffer);
|
m_debug_text_vbo_data.load(ri.commandBuffer);
|
||||||
|
|
||||||
KRRenderPass* debugPass = surface.getRenderPass(RenderPassType::RENDER_PASS_DEBUG_OVERLAYS);
|
|
||||||
debugPass->begin(commandBuffer, surface);
|
|
||||||
|
|
||||||
KRTexture* fontTexture = m_pContext->getTextureManager()->getTexture("font");
|
KRTexture* fontTexture = m_pContext->getTextureManager()->getTexture("font");
|
||||||
fontTexture->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_UI);
|
fontTexture->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_UI);
|
||||||
@@ -798,29 +826,20 @@ void KRCamera::renderDebug(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
std::string shader_name("debug_font");
|
std::string shader_name("debug_font");
|
||||||
info.shader_name = &shader_name;
|
info.shader_name = &shader_name;
|
||||||
info.pCamera = this;
|
info.pCamera = this;
|
||||||
info.renderPass = surface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
|
info.renderPass = ri.renderPass;
|
||||||
info.rasterMode = RasterMode::kAlphaBlendNoTest;
|
info.rasterMode = RasterMode::kAlphaBlendNoTest;
|
||||||
info.cullMode = CullMode::kCullNone;
|
info.cullMode = CullMode::kCullNone;
|
||||||
info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA);
|
info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA);
|
||||||
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES;
|
info.modelFormat = ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES;
|
||||||
KRPipeline* fontShader = m_pContext->getPipelineManager()->getPipeline(surface, info);
|
KRPipeline* fontShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
|
|
||||||
RenderInfo ri(commandBuffer);
|
|
||||||
ri.camera = this;
|
|
||||||
ri.renderPass = surface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT);
|
|
||||||
ri.surface = &surface;
|
|
||||||
ri.viewport = &m_viewport;
|
|
||||||
|
|
||||||
|
|
||||||
fontShader->setImageBinding("fontTexture", fontTexture, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER);
|
fontShader->setImageBinding("fontTexture", fontTexture, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER);
|
||||||
fontShader->bind(ri, Matrix4());
|
fontShader->bind(ri, Matrix4());
|
||||||
|
|
||||||
m_debug_text_vbo_data.bind(commandBuffer);
|
m_debug_text_vbo_data.bind(ri.commandBuffer);
|
||||||
|
|
||||||
vkCmdDraw(commandBuffer, vertex_count, 1, 0, 0);
|
vkCmdDraw(ri.commandBuffer, vertex_count, 1, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
debugPass->end(commandBuffer);
|
|
||||||
|
|
||||||
m_debug_text_vertices.unlock();
|
m_debug_text_vertices.unlock();
|
||||||
|
|
||||||
@@ -1024,9 +1043,9 @@ std::string KRCamera::getDebugText()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const KRViewport& KRCamera::getViewport() const
|
KRViewport* KRCamera::getViewport()
|
||||||
{
|
{
|
||||||
return m_viewport;
|
return &m_viewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KRCamera::setFadeColor(const Vector4& fade_color)
|
void KRCamera::setFadeColor(const Vector4& fade_color)
|
||||||
|
|||||||
@@ -59,9 +59,11 @@ public:
|
|||||||
|
|
||||||
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface);
|
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface);
|
||||||
|
|
||||||
|
void render(KRNode::RenderInfo& ri);
|
||||||
|
|
||||||
KRRenderSettings settings;
|
KRRenderSettings settings;
|
||||||
|
|
||||||
const KRViewport& getViewport() const;
|
KRViewport* getViewport();
|
||||||
|
|
||||||
|
|
||||||
virtual std::string getElementName() override;
|
virtual std::string getElementName() override;
|
||||||
@@ -89,8 +91,8 @@ private:
|
|||||||
|
|
||||||
int volumetricLightAccumulationBuffer, volumetricLightAccumulationTexture;
|
int volumetricLightAccumulationBuffer, volumetricLightAccumulationTexture;
|
||||||
|
|
||||||
void renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface);
|
void renderPost(RenderInfo& ri);
|
||||||
void renderDebug(VkCommandBuffer& commandBuffer, KRSurface& surface);
|
void renderDebug(RenderInfo& ri);
|
||||||
|
|
||||||
void destroyBuffers();
|
void destroyBuffers();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user