From b801da7eb37f3fcfcbeb2795270fadb6e90aa89a Mon Sep 17 00:00:00 2001 From: kearwood Date: Mon, 4 Jul 2022 20:18:00 -0700 Subject: [PATCH] Blending and depth testing refactoring to Vulkan. Eliminating OpenGL state following. --- kraken/KRCamera.cpp | 77 ++++-------------------------------- kraken/KRLight.cpp | 1 + kraken/KRMaterialManager.cpp | 25 +----------- kraken/KRMaterialManager.h | 3 -- kraken/KRPipeline.cpp | 5 +++ kraken/KRPipeline.h | 13 ++++++ kraken/KRReverbZone.cpp | 1 + 7 files changed, 29 insertions(+), 96 deletions(-) diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index 588bea5..f13b100 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -261,6 +261,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; + info.rasterMode = PipelineInfo::RasterMode::kAlphaBlend; KRPipeline* testPipeline = m_pContext->getPipelineManager()->getPipeline(surface, info, testVertices.getVertexAttributes(), KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_STRIP); testPipeline->bind(commandBuffer); testVertices.bind(commandBuffer); @@ -316,9 +317,8 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) // ----====---- Transparent Geometry, Forward Rendering ----====---- // TODO - Vulkan refactoring... - /* GL_PUSH_GROUP_MARKER("Forward Rendering - Transparent"); - + /* // Note: These parameters have already been set up by the skybox render above // // // Set render target @@ -331,69 +331,36 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) // Enable backface culling GLDEBUG(glCullFace(GL_BACK)); GLDEBUG(glEnable(GL_CULL_FACE)); - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); -// -// // Enable z-buffer test -// GLDEBUG(glEnable(GL_DEPTH_TEST)); -// GLDEBUG(glDepthFunc(GL_LEQUAL)); -// GLDEBUG(glDepthRangef(0.0, 1.0)); - - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); */ // Render all transparent geometry scene.render(commandBuffer, surface, this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, false); - - // TODO - Vulkan refactoring... - /* + GL_POP_GROUP_MARKER; - */ // ----====---- Particle Occlusion Tests ----====---- - // TODO - Vulkan refactoring... - /* GL_PUSH_GROUP_MARKER("Particle Occlusion Tests"); - + /* // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); // Disable backface culling GLDEBUG(glDisable(GL_CULL_FACE)); - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LEQUAL)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - */ // ----====---- Perform Occlusion Tests ----====---- scene.render(commandBuffer, surface, this, m_viewport.getVisibleBounds(), m_viewport, RENDER_PASS_PARTICLE_OCCLUSION, false); - // TODO - Vulkan refactoring... - /* GL_POP_GROUP_MARKER; - */ // ----====---- Flares ----====---- - // TODO - Vulkan refactoring... - /* GL_PUSH_GROUP_MARKER("Additive Particles"); + + /* // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); @@ -401,27 +368,12 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) // Disable backface culling GLDEBUG(glDisable(GL_CULL_FACE)); - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - */ // Render all flares scene.render(commandBuffer, surface, this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_ADDITIVE_PARTICLES, false); - // TODO - Vulkan refactoring... - /* GL_POP_GROUP_MARKER; - */ // ----====---- Volumetric Lighting ----====---- @@ -467,9 +419,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) // ----====---- Debug Overlay ----====---- // TODO - Vulkan refactoring... - /* GL_PUSH_GROUP_MARKER("Debug Overlays"); - */ if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { @@ -495,11 +445,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) } } } - -/* 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()); // TODO - Vulkan refactoring... @@ -682,10 +628,6 @@ void KRCamera::destroyBuffers() void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) { - // Disable alpha blending - GLDEBUG(glDisable(GL_BLEND)); - - /* FINDME - Determine if we still need this... @@ -709,13 +651,14 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) GLDEBUG(glViewport(0, 0, (GLsizei)m_viewport.getSize().x, (GLsizei)m_viewport.getSize().y)); - GLDEBUG(glDisable(GL_DEPTH_TEST)); + PipelineInfo info{}; std::string shader_name("PostShader"); info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; + info.rasterMode = PipelineInfo::RasterMode::kOpaqueNoTest; KRPipeline *postShader = m_pContext->getPipelineManager()->getPipeline(surface, info); @@ -888,7 +831,6 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) } } - // Disable backface culling GLDEBUG(glDisable(GL_CULL_FACE)); @@ -913,9 +855,6 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, vertex_count)); - // Re-enable z-buffer write - GLDEBUG(glDepthMask(GL_TRUE)); - m_debug_text_vertices.unlock(); } else { diff --git a/kraken/KRLight.cpp b/kraken/KRLight.cpp index 27755cd..8b51480 100755 --- a/kraken/KRLight.cpp +++ b/kraken/KRLight.cpp @@ -356,6 +356,7 @@ void KRLight::render(RenderInfo& ri) { info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; if(getContext().getPipelineManager()->selectPipeline(*ri.surface, info, ri.viewport, occlusion_test_sphere_matrix, Vector3::Zero(), 0.0f, Vector4::Zero())) { diff --git a/kraken/KRMaterialManager.cpp b/kraken/KRMaterialManager.cpp index 053e1cf..9da005f 100755 --- a/kraken/KRMaterialManager.cpp +++ b/kraken/KRMaterialManager.cpp @@ -65,30 +65,7 @@ KRResource* KRMaterialManager::getResource(const std::string& name, const std::s unordered_map &KRMaterialManager::getMaterials() { return m_materials; -} - -void KRMaterialManager::configure(bool blend_enable, GLenum blend_src, GLenum blend_dest, bool depth_test_enable, GLenum depth_func, bool depth_write_enable) { - if(blend_enable) { - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(blend_src, blend_dest)); - } else { - GLDEBUG(glDisable(GL_BLEND)); - } - - if(depth_test_enable) { - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(depth_func)); - } else { - GLDEBUG(glDisable(GL_DEPTH_TEST)); - } - - if(depth_write_enable) { - GLDEBUG(glDepthMask(GL_TRUE)); - } else { - GLDEBUG(glDepthMask(GL_FALSE)); - } -} - +} KRMaterial *KRMaterialManager::getMaterial(const std::string &name) { std::string lowerName = name; diff --git a/kraken/KRMaterialManager.h b/kraken/KRMaterialManager.h index 6fbed6a..7a5d467 100755 --- a/kraken/KRMaterialManager.h +++ b/kraken/KRMaterialManager.h @@ -55,9 +55,6 @@ public: void add(KRMaterial *new_material); KRMaterial *getMaterial(const std::string &name); - void configure(bool blend_enable, GLenum blend_src, GLenum blend_dest, bool depth_test_enable, GLenum depth_func, bool depth_write_enable); - - unordered_map &getMaterials(); private: diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 49b7305..35a9fbe 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -283,6 +283,7 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf switch (info.rasterMode) { case PipelineInfo::RasterMode::kOpaque: case PipelineInfo::RasterMode::kOpaqueLessTest: + case PipelineInfo::RasterMode::kOpaqueNoTest: case PipelineInfo::RasterMode::kOpaqueNoDepthWrite: colorBlendAttachment.blendEnable = VK_FALSE; colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; @@ -338,6 +339,10 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf depthStencil.depthTestEnable = VK_TRUE; depthStencil.depthWriteEnable = VK_TRUE; break; + case PipelineInfo::RasterMode::kOpaqueNoTest: + depthStencil.depthTestEnable = VK_FALSE; + depthStencil.depthWriteEnable = VK_TRUE; + break; case PipelineInfo::RasterMode::kOpaqueNoDepthWrite: case PipelineInfo::RasterMode::kAlphaBlend: case PipelineInfo::RasterMode::kAdditive: diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index 6703aeb..856814d 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -92,6 +92,19 @@ public: glEnable(GL_DEPTH_TEST)) glDepthFunc(GL_LESS); glDepthRangef(0.0, 1.0); +*/ + kOpaqueNoTest, +/* + kOpaqueNoTest is equivalent to: + + // Disable blending + glDisable(GL_BLEND)); + + // Enable z-buffer write + glDepthMask(GL_TRUE); + + // Disable z-buffer test + glDisable(GL_DEPTH_TEST) */ kAlphaBlend, /* diff --git a/kraken/KRReverbZone.cpp b/kraken/KRReverbZone.cpp index 8ae30c7..eefd9c2 100755 --- a/kraken/KRReverbZone.cpp +++ b/kraken/KRReverbZone.cpp @@ -135,6 +135,7 @@ void KRReverbZone::render(RenderInfo& ri) info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAlphaBlend; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); info.rasterMode = PipelineInfo::RasterMode::kAdditive;