From e0e51c3f07131370f2d7c30f92888f2db14636e4 Mon Sep 17 00:00:00 2001 From: kearwood Date: Sun, 3 Jul 2022 21:13:39 -0700 Subject: [PATCH] Added PipeLineInfo::RasterMode::kOpaqueLessTest Refactored particles and additive effects to use PipelineInfo::RasterMode rather than direct GL calls. --- kraken/KRBone.cpp | 7 ------- kraken/KRDirectionalLight.cpp | 7 +------ kraken/KRLight.cpp | 24 +++++++----------------- kraken/KRParticleSystemNewtonian.cpp | 7 +------ kraken/KRPipeline.h | 23 +++++++++++++++++++---- 5 files changed, 28 insertions(+), 40 deletions(-) diff --git a/kraken/KRBone.cpp b/kraken/KRBone.cpp index d032255..ef58712 100755 --- a/kraken/KRBone.cpp +++ b/kraken/KRBone.cpp @@ -101,13 +101,6 @@ void KRBone::render(RenderInfo& ri) } } - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LEQUAL)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - - } } diff --git a/kraken/KRDirectionalLight.cpp b/kraken/KRDirectionalLight.cpp index 91f092f..d4e381c 100755 --- a/kraken/KRDirectionalLight.cpp +++ b/kraken/KRDirectionalLight.cpp @@ -144,6 +144,7 @@ void KRDirectionalLight::render(RenderInfo& ri) { info.pCamera = ri.camera; info.directional_lights = &this_light; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest; KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pShader, ri.viewport, getModelMatrix(), nullptr, &this_light, nullptr, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { @@ -152,12 +153,6 @@ void KRDirectionalLight::render(RenderInfo& ri) { pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_COLOR, m_color); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); - // Disable z-buffer write - GLDEBUG(glDepthMask(GL_FALSE)); - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - // Render a full screen quad m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); diff --git a/kraken/KRLight.cpp b/kraken/KRLight.cpp index ce1d443..27755cd 100755 --- a/kraken/KRLight.cpp +++ b/kraken/KRLight.cpp @@ -232,11 +232,9 @@ void KRLight::render(RenderInfo& ri) { float particle_range = 600.0f; int particle_count = (int)(m_dust_particle_density * pow(particle_range, 3)); - if(particle_count > KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES) particle_count = KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES; - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthRangef(0.0, 1.0)); + if (particle_count > KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES) { + particle_count = KRMeshManager::KRENGINE_MAX_RANDOM_PARTICLES; + } Matrix4 particleModelMatrix; particleModelMatrix.scale(particle_range); // Scale the box symetrically to ensure that we don't have an uneven distribution of particles for different angles of the view frustrum @@ -266,6 +264,7 @@ void KRLight::render(RenderInfo& ri) { info.directional_lights = &this_directional_light; info.spot_lights = &this_spot_light; info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; KRPipeline *pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); if(getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, pParticleShader, ri.viewport, particleModelMatrix, &this_point_light, &this_directional_light, &this_spot_light, 0, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero())) { @@ -313,6 +312,7 @@ void KRLight::render(RenderInfo& ri) { info.directional_lights = &this_directional_light; info.spot_lights = &this_spot_light; info.renderPass = KRNode::RENDER_PASS_ADDITIVE_PARTICLES; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; KRPipeline *pFogShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); @@ -398,10 +398,6 @@ void KRLight::render(RenderInfo& ri) { } if(m_pFlareTexture) { - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - // Render light flare on transparency pass PipelineInfo info{}; std::string shader_name("flare"); @@ -411,6 +407,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::kAdditiveNoTest; 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())) { @@ -519,20 +516,13 @@ void KRLight::renderShadowBuffers(RenderInfo& ri) //GLDEBUG(glEnable(GL_CULL_FACE)); GLDEBUG(glDisable(GL_CULL_FACE)); - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - 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 - GLDEBUG(glDisable(GL_BLEND)); - // Use shader program PipelineInfo info{}; std::string shader_name("ShadowShader"); info.shader_name = &shader_name; info.pCamera = ri.camera; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; + info.rasterMode = PipelineInfo::RasterMode::kOpaqueLessTest; KRPipeline *shadowShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); getContext().getPipelineManager()->selectPipeline(*ri.surface, *ri.camera, shadowShader, m_shadowViewports[iShadow], Matrix4(), nullptr, nullptr, nullptr, 0, KRNode::RENDER_PASS_SHADOWMAP, Vector3::Zero(), 0.0f, Vector4::Zero()); diff --git a/kraken/KRParticleSystemNewtonian.cpp b/kraken/KRParticleSystemNewtonian.cpp index 3cbfcb6..31ba52b 100755 --- a/kraken/KRParticleSystemNewtonian.cpp +++ b/kraken/KRParticleSystemNewtonian.cpp @@ -86,12 +86,6 @@ void KRParticleSystemNewtonian::render(RenderInfo& ri) { if(ri.renderPass == KRNode::RENDER_PASS_ADDITIVE_PARTICLES) { if(ri.viewport.visible(getBounds())) { - - - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - KRTexture *pParticleTexture = m_pContext->getTextureManager()->getTexture("flare"); m_pContext->getTextureManager()->selectTexture(0, pParticleTexture, 0.0f, KRTexture::TEXTURE_USAGE_PARTICLE); @@ -104,6 +98,7 @@ void KRParticleSystemNewtonian::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 *pParticleShader = m_pContext->getPipelineManager()->getPipeline(*ri.surface, info); // Vector3 rim_color; Vector4 fade_color; diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index 55cad8e..9e6c126 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -63,7 +63,22 @@ public: glDepthFunc(GL_LEQUAL); glDepthRangef(0.0, 1.0); */ - kAlphaBlend = 1, + kOpaqueLessTest, +/* + kOpaqueLessTest 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_LESS); + glDepthRangef(0.0, 1.0); +*/ + kAlphaBlend, /* kAlphaBlend is equivalent to: @@ -79,7 +94,7 @@ public: glDepthFunc(GL_LEQUAL); glDepthRangef(0.0, 1.0); */ - kAlphaBlendNoTest = 2, + kAlphaBlendNoTest, /* kAlphaBlendNoTest is equivalent to: @@ -93,7 +108,7 @@ public: // Disable z-buffer test glDisable(GL_DEPTH_TEST) */ - kAdditive = 3, + kAdditive, /* kAdditive is equivalent to: @@ -109,7 +124,7 @@ public: glDepthFunc(GL_LEQUAL); glDepthRangef(0.0, 1.0); */ - kAdditiveNoTest = 4, + kAdditiveNoTest, /* kAdditive is equivalent to: