From 8db6a4313f92650aa33f60652dedf00e3a9ddda0 Mon Sep 17 00:00:00 2001 From: kearwood Date: Sat, 2 Jul 2022 21:01:02 -0700 Subject: [PATCH] Combined depth test and depth write modes into PipelineInfo.rasterMode. --- kraken/KRAmbientZone.cpp | 8 ---- kraken/KRAudioSource.cpp | 8 ---- kraken/KRBone.cpp | 8 +--- kraken/KRCamera.cpp | 19 +-------- kraken/KRCollider.cpp | 8 ---- kraken/KRLight.cpp | 2 +- kraken/KRPipeline.h | 75 +++++++++++++++++++++++++++++++++++- kraken/KRPipelineManager.cpp | 4 +- kraken/KRPointLight.cpp | 22 ++++------- kraken/KRReverbZone.cpp | 8 ---- kraken/KRScene.cpp | 21 +--------- kraken/KRSprite.cpp | 15 +------- 12 files changed, 91 insertions(+), 107 deletions(-) diff --git a/kraken/KRAmbientZone.cpp b/kraken/KRAmbientZone.cpp index 8d59a21..4d1231e 100755 --- a/kraken/KRAmbientZone.cpp +++ b/kraken/KRAmbientZone.cpp @@ -142,14 +142,6 @@ void KRAmbientZone::render(RenderInfo& ri) KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pPipeline, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { - - // 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)); std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { diff --git a/kraken/KRAudioSource.cpp b/kraken/KRAudioSource.cpp index 8dc7f05..4d0854e 100755 --- a/kraken/KRAudioSource.cpp +++ b/kraken/KRAudioSource.cpp @@ -209,14 +209,6 @@ void KRAudioSource::render(RenderInfo& ri) KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pShader, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { - - // 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)); std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { diff --git a/kraken/KRBone.cpp b/kraken/KRBone.cpp index 955819d..d032255 100755 --- a/kraken/KRBone.cpp +++ b/kraken/KRBone.cpp @@ -80,12 +80,6 @@ void KRBone::render(RenderInfo& ri) if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { Matrix4 sphereModelMatrix = getModelMatrix(); - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - PipelineInfo info{}; std::string shader_name("visualize_overlay"); info.shader_name = &shader_name; @@ -94,7 +88,7 @@ void KRBone::render(RenderInfo& ri) info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; - info.rasterMode = PipelineInfo::RasterMode::kAdditive; + info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index fcc6345..df7d85c 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -525,11 +525,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) GL_PUSH_GROUP_MARKER("Debug Overlays"); */ - if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - + if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { // Enable backface culling GLDEBUG(glCullFace(GL_BACK)); @@ -554,11 +550,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) } } - // TODO - Vulkan refactoring... /* - // Re-enable z-buffer write - GLDEBUG(glDepthMask(GL_TRUE)); - GL_POP_GROUP_MARKER; */ @@ -954,19 +946,12 @@ void KRCamera::renderPost(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)); - PipelineInfo info{}; std::string shader_name("debug_font"); info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; - info.rasterMode = PipelineInfo::RasterMode::kAlphaBlend; + info.rasterMode = PipelineInfo::RasterMode::kAlphaBlendNoTest; KRPipeline *fontShader = m_pContext->getPipelineManager()->getPipeline(surface, info); getContext().getPipelineManager()->selectPipeline(surface, *this, fontShader, m_viewport, Matrix4(), nullptr, nullptr, nullptr, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero()); diff --git a/kraken/KRCollider.cpp b/kraken/KRCollider.cpp index 6bacfe1..1deb81b 100755 --- a/kraken/KRCollider.cpp +++ b/kraken/KRCollider.cpp @@ -217,14 +217,6 @@ void KRCollider::render(RenderInfo& ri) KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pShader, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { - // 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)); - for(int i=0; i < m_models[0]->getSubmeshCount(); i++) { m_models[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); } diff --git a/kraken/KRLight.cpp b/kraken/KRLight.cpp index 7ae0a49..ce1d443 100755 --- a/kraken/KRLight.cpp +++ b/kraken/KRLight.cpp @@ -521,7 +521,7 @@ void KRLight::renderShadowBuffers(RenderInfo& ri) // Enable z-buffer test GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LESS)); + GLDEBUG(glDepthFunc(GL_LESS)); // CAREFUL WHEN REFACTORING! GL_LESS! not GL_LEQUAL GLDEBUG(glDepthRangef(0.0, 1.0)); // Disable alpha blending as we are using alpha channel for packed depth info diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index 333aee3..3b08e8f 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -46,10 +46,83 @@ class KRRenderPass; class PipelineInfo { public: + // Note: RasterMode is likely to be refactored later to a bitfield enum class RasterMode : uint32_t { kOpaque = 0, +/* + kOpaque is equivalent to: + + // Disable blending + glDisable(GL_BLEND)); + + // Enable z-buffer write + glDepthMask(GL_TRUE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST)) + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); +*/ kAlphaBlend = 1, - kAdditive = 2 +/* + kAlphaBlend is equivalent to: + + // Enable alpha blending + glEnable(GL_BLEND)); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST)) + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); +*/ + kAlphaBlendNoTest = 2, +/* + kAlphaBlendNoTest is equivalent to: + + // Enable alpha blending + glEnable(GL_BLEND)); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST)) + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); +*/ + kAdditive = 3, +/* + kAdditive is equivalent to: + + // Enable additive blending + glEnable(GL_BLEND)); + glBlendFunc(GL_ONE, GL_ONE)); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Disalbe z-buffer test + glDisable(GL_DEPTH_TEST) +*/ + kAdditiveNoTest = 4, + /* + kAdditive is equivalent to: + + // Enable additive blending + glEnable(GL_BLEND)); + glBlendFunc(GL_ONE, GL_ONE)); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Disalbe z-buffer test + glDisable(GL_DEPTH_TEST) + */ }; const std::string* shader_name; KRCamera* pCamera; diff --git a/kraken/KRPipelineManager.cpp b/kraken/KRPipelineManager.cpp index e7f8985..8218f32 100644 --- a/kraken/KRPipelineManager.cpp +++ b/kraken/KRPipelineManager.cpp @@ -218,7 +218,9 @@ KRPipeline *KRPipelineManager::getPipeline(KRSurface& surface, const PipelineInf stream << "\n#define ALPHA_TEST " << (info.bAlphaTest ? "1" : "0"); stream << "\n#define ALPHA_BLEND " << ((info.rasterMode == PipelineInfo::RasterMode::kAlphaBlend - || info.rasterMode == PipelineInfo::RasterMode::kAdditive) ? "1" : "0"); + || info.rasterMode == PipelineInfo::RasterMode::kAlphaBlendNoTest + || info.rasterMode == PipelineInfo::RasterMode::kAdditive + || info.rasterMode == PipelineInfo::RasterMode::kAdditiveNoTest) ? "1" : "0"); stream << "\n#define ENABLE_PER_PIXEL " << (info.pCamera->settings.bEnablePerPixel ? "1" : "0"); stream << "\n#define DEBUG_PSSM " << (info.pCamera->settings.bDebugPSSM ? "1" : "0"); diff --git a/kraken/KRPointLight.cpp b/kraken/KRPointLight.cpp index 35dd319..fdf051f 100755 --- a/kraken/KRPointLight.cpp +++ b/kraken/KRPointLight.cpp @@ -102,37 +102,29 @@ void KRPointLight::render(RenderInfo& ri) info.pCamera = ri.camera; info.point_lights = &this_light; info.renderPass = ri.renderPass; - info.rasterMode = bVisualize ? PipelineInfo::RasterMode::kAdditive : PipelineInfo::RasterMode::kAlphaBlend; + if (bInsideLight) { + info.rasterMode = bVisualize ? PipelineInfo::RasterMode::kAdditiveNoTest : PipelineInfo::RasterMode::kAlphaBlendNoTest; + } + else { + info.rasterMode = bVisualize ? PipelineInfo::RasterMode::kAdditive : PipelineInfo::RasterMode::kAlphaBlend; + } + KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pShader, ri.viewport, sphereModelMatrix, &this_light, nullptr, nullptr, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { - pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_DECAY_START, getDecayStart()); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_CUTOFF, KRLIGHT_MIN_INFLUENCE); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_POSITION, light_position); - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - if(bInsideLight) { - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - // Render a full screen quad m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); } else { // Render sphere of light's influence generateMesh(); - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LEQUAL)); - GLDEBUG(glDepthRangef(0.0, 1.0)); GLDEBUG(glVertexAttribPointer(KRMesh::KRENGINE_ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, m_sphereVertices)); GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, m_cVertices)); diff --git a/kraken/KRReverbZone.cpp b/kraken/KRReverbZone.cpp index d1dd985..8ae30c7 100755 --- a/kraken/KRReverbZone.cpp +++ b/kraken/KRReverbZone.cpp @@ -140,14 +140,6 @@ void KRReverbZone::render(RenderInfo& ri) info.rasterMode = PipelineInfo::RasterMode::kAdditive; if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pShader, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { - - // 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)); std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { diff --git a/kraken/KRScene.cpp b/kraken/KRScene.cpp index 71354ef..482ae2b 100755 --- a/kraken/KRScene.cpp +++ b/kraken/KRScene.cpp @@ -276,8 +276,6 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere if(bNeedOcclusionTest) { pOctreeNode->beginOcclusionQuery(); - - Matrix4 matModel = Matrix4(); matModel.scale(octreeBounds.size() * 0.5f); matModel.translate(octreeBounds.center()); @@ -286,14 +284,6 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere getContext().getMeshManager()->bindVBO(ri.commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES, 1.0f); - if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_OPAQUE || - ri.renderPass == KRNode::RENDER_PASS_DEFERRED_GBUFFER || - ri.renderPass == KRNode::RENDER_PASS_DEFERRED_OPAQUE || - ri.renderPass == KRNode::RENDER_PASS_SHADOWMAP) { - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - } PipelineInfo info{}; std::string shader_name("occlusion_test"); info.shader_name = &shader_name; @@ -308,16 +298,7 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14)); m_pContext->getMeshManager()->log_draw_call(ri.renderPass, "octree", "occlusion_test", 14); } - - if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_OPAQUE || - ri.renderPass == KRNode::RENDER_PASS_DEFERRED_GBUFFER || - ri.renderPass == KRNode::RENDER_PASS_DEFERRED_OPAQUE || - ri.renderPass == KRNode::RENDER_PASS_SHADOWMAP) { - - // Re-enable z-buffer write - GLDEBUG(glDepthMask(GL_TRUE)); - } - + pOctreeNode->endOcclusionQuery(); diff --git a/kraken/KRSprite.cpp b/kraken/KRSprite.cpp index 015160c..f60f9bc 100755 --- a/kraken/KRSprite.cpp +++ b/kraken/KRSprite.cpp @@ -138,20 +138,9 @@ void KRSprite::render(RenderInfo& ri) { m_pSpriteTexture = getContext().getTextureManager()->getTexture(m_spriteTexture); } - if(m_pSpriteTexture) { - /* - - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - */ - + if(m_pSpriteTexture) { // TODO - Sprites are currently additive only. Need to expose this and allow for multiple blending modes - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LEQUAL)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - + // Render light sprite on transparency pass PipelineInfo info{}; std::string shader_name("sprite");