From d571bcbdc317b610219dfe67a455aa7373e86a0f Mon Sep 17 00:00:00 2001 From: kearwood Date: Sat, 2 Jul 2022 20:07:11 -0700 Subject: [PATCH] Refactor OpenGL alpha blending to use PipelineInfo.rasterMode --- kraken/KRAmbientZone.cpp | 9 --------- kraken/KRAudioSource.cpp | 10 +--------- kraken/KRBone.cpp | 10 +--------- kraken/KRCamera.cpp | 9 ++------- kraken/KRCollider.cpp | 12 +----------- kraken/KRPointLight.cpp | 13 +------------ kraken/KRReverbZone.cpp | 11 ++--------- kraken/KRScene.cpp | 18 ++---------------- kraken/KRSprite.cpp | 4 +--- 9 files changed, 11 insertions(+), 85 deletions(-) diff --git a/kraken/KRAmbientZone.cpp b/kraken/KRAmbientZone.cpp index 4a80747..8d59a21 100755 --- a/kraken/KRAmbientZone.cpp +++ b/kraken/KRAmbientZone.cpp @@ -143,11 +143,6 @@ void KRAmbientZone::render(RenderInfo& ri) 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())) { - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -161,10 +156,6 @@ void KRAmbientZone::render(RenderInfo& ri) sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } - - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); } } } diff --git a/kraken/KRAudioSource.cpp b/kraken/KRAudioSource.cpp index 7166737..8dc7f05 100755 --- a/kraken/KRAudioSource.cpp +++ b/kraken/KRAudioSource.cpp @@ -204,16 +204,12 @@ void KRAudioSource::render(RenderInfo& ri) info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; 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())) { - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -227,10 +223,6 @@ void KRAudioSource::render(RenderInfo& ri) sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } - - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); } } } diff --git a/kraken/KRBone.cpp b/kraken/KRBone.cpp index 5feaf39..955819d 100755 --- a/kraken/KRBone.cpp +++ b/kraken/KRBone.cpp @@ -80,11 +80,6 @@ void KRBone::render(RenderInfo& ri) if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { Matrix4 sphereModelMatrix = getModelMatrix(); - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -99,6 +94,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; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); @@ -112,10 +108,6 @@ void KRBone::render(RenderInfo& ri) } - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); - // Enable z-buffer test GLDEBUG(glEnable(GL_DEPTH_TEST)); GLDEBUG(glDepthFunc(GL_LEQUAL)); diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index 5e8b4d5..fcc6345 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -535,15 +535,12 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface) GLDEBUG(glCullFace(GL_BACK)); GLDEBUG(glEnable(GL_CULL_FACE)); - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - PipelineInfo info{}; std::string shader_name("visualize_overlay"); info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; KRPipeline *pVisShader = getContext().getPipelineManager()->getPipeline(surface, info); m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES, 1.0f); @@ -964,14 +961,12 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) GLDEBUG(glDisable(GL_DEPTH_TEST)); // GLDEBUG(glDepthRangef(0.0, 1.0)); - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); 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; 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 78a79cc..6bacfe1 100755 --- a/kraken/KRCollider.cpp +++ b/kraken/KRCollider.cpp @@ -212,16 +212,11 @@ void KRCollider::render(RenderInfo& ri) info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; 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())) { - - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -230,14 +225,9 @@ void KRCollider::render(RenderInfo& ri) 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); } - - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); } GL_POP_GROUP_MARKER; diff --git a/kraken/KRPointLight.cpp b/kraken/KRPointLight.cpp index 3856972..35dd319 100755 --- a/kraken/KRPointLight.cpp +++ b/kraken/KRPointLight.cpp @@ -102,6 +102,7 @@ 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; 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())) { @@ -111,13 +112,6 @@ void KRPointLight::render(RenderInfo& ri) 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); - - - if(bVisualize) { - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - } // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -144,11 +138,6 @@ void KRPointLight::render(RenderInfo& ri) GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, m_cVertices)); } } - if(bVisualize) { - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); - } } } } diff --git a/kraken/KRReverbZone.cpp b/kraken/KRReverbZone.cpp index 7b2af35..d1dd985 100755 --- a/kraken/KRReverbZone.cpp +++ b/kraken/KRReverbZone.cpp @@ -137,14 +137,10 @@ void KRReverbZone::render(RenderInfo& ri) info.renderPass = ri.renderPass; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + 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())) { - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -158,10 +154,7 @@ void KRReverbZone::render(RenderInfo& ri) sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); } } - - // Enable alpha blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + } } } diff --git a/kraken/KRScene.cpp b/kraken/KRScene.cpp index a392d68..71354ef 100755 --- a/kraken/KRScene.cpp +++ b/kraken/KRScene.cpp @@ -286,13 +286,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); - // Enable additive blending - if(ri.renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT && ri.renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && ri.renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) { - GLDEBUG(glEnable(GL_BLEND)); - } - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); - - if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_OPAQUE || ri.renderPass == KRNode::RENDER_PASS_DEFERRED_GBUFFER || ri.renderPass == KRNode::RENDER_PASS_DEFERRED_OPAQUE || @@ -309,6 +302,7 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; if(getContext().getPipelineManager()->selectPipeline(*ri.surface, info, ri.viewport, matModel, Vector3::Zero(), 0.0f, Vector4::Zero())) { GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14)); @@ -325,15 +319,7 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere } pOctreeNode->endOcclusionQuery(); - - if(ri.renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT && ri.renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && ri.renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) { - GLDEBUG(glDisable(GL_BLEND)); - } else if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT) { - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); - } else { - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // RENDER_PASS_FORWARD_TRANSPARENT and RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE - } - + if(bVisible) { // Schedule a pass to get the result of the occlusion test only for future frames and passes, without rendering the model or recurring further diff --git a/kraken/KRSprite.cpp b/kraken/KRSprite.cpp index a157cdd..015160c 100755 --- a/kraken/KRSprite.cpp +++ b/kraken/KRSprite.cpp @@ -140,9 +140,6 @@ void KRSprite::render(RenderInfo& ri) { if(m_pSpriteTexture) { /* - // Enable additive blending - GLDEBUG(glEnable(GL_BLEND)); - GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // Disable z-buffer write GLDEBUG(glDepthMask(GL_FALSE)); @@ -164,6 +161,7 @@ void KRSprite::render(RenderInfo& ri) { info.directional_lights = &ri.directional_lights; info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; 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())) { pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_spriteAlpha);