Combined depth test and depth write modes into PipelineInfo.rasterMode.

This commit is contained in:
2022-07-02 21:01:02 -07:00
parent d292c86b6e
commit 8db6a4313f
12 changed files with 91 additions and 107 deletions

View File

@@ -142,14 +142,6 @@ void KRAmbientZone::render(RenderInfo& ri)
KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); 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())) { 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<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere"); std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
if(sphereModels.size()) { if(sphereModels.size()) {
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {

View File

@@ -209,14 +209,6 @@ void KRAudioSource::render(RenderInfo& ri)
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); 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())) { 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<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere"); std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
if(sphereModels.size()) { if(sphereModels.size()) {
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {

View File

@@ -80,12 +80,6 @@ void KRBone::render(RenderInfo& ri)
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
Matrix4 sphereModelMatrix = getModelMatrix(); Matrix4 sphereModelMatrix = getModelMatrix();
// Disable z-buffer write
GLDEBUG(glDepthMask(GL_FALSE));
// Disable z-buffer test
GLDEBUG(glDisable(GL_DEPTH_TEST));
PipelineInfo info{}; PipelineInfo info{};
std::string shader_name("visualize_overlay"); std::string shader_name("visualize_overlay");
info.shader_name = &shader_name; info.shader_name = &shader_name;
@@ -94,7 +88,7 @@ void KRBone::render(RenderInfo& ri)
info.directional_lights = &ri.directional_lights; info.directional_lights = &ri.directional_lights;
info.spot_lights = &ri.spot_lights; info.spot_lights = &ri.spot_lights;
info.renderPass = ri.renderPass; info.renderPass = ri.renderPass;
info.rasterMode = PipelineInfo::RasterMode::kAdditive; info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest;
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);

View File

@@ -525,11 +525,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface)
GL_PUSH_GROUP_MARKER("Debug Overlays"); GL_PUSH_GROUP_MARKER("Debug Overlays");
*/ */
if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) {
// Enable z-buffer test
GLDEBUG(glEnable(GL_DEPTH_TEST));
GLDEBUG(glDepthRangef(0.0, 1.0));
// Enable backface culling // Enable backface culling
GLDEBUG(glCullFace(GL_BACK)); 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; GL_POP_GROUP_MARKER;
*/ */
@@ -954,19 +946,12 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
// Disable backface culling // Disable backface culling
GLDEBUG(glDisable(GL_CULL_FACE)); 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{}; PipelineInfo info{};
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 = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; 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); 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()); getContext().getPipelineManager()->selectPipeline(surface, *this, fontShader, m_viewport, Matrix4(), nullptr, nullptr, nullptr, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero());

View File

@@ -217,14 +217,6 @@ void KRCollider::render(RenderInfo& ri)
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); 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())) { 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++) { for(int i=0; i < m_models[0]->getSubmeshCount(); i++) {
m_models[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); m_models[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f);
} }

View File

@@ -521,7 +521,7 @@ void KRLight::renderShadowBuffers(RenderInfo& ri)
// Enable z-buffer test // Enable z-buffer test
GLDEBUG(glEnable(GL_DEPTH_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)); GLDEBUG(glDepthRangef(0.0, 1.0));
// Disable alpha blending as we are using alpha channel for packed depth info // Disable alpha blending as we are using alpha channel for packed depth info

View File

@@ -46,10 +46,83 @@ class KRRenderPass;
class PipelineInfo { class PipelineInfo {
public: public:
// Note: RasterMode is likely to be refactored later to a bitfield
enum class RasterMode : uint32_t { enum class RasterMode : uint32_t {
kOpaque = 0, 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, 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; const std::string* shader_name;
KRCamera* pCamera; KRCamera* pCamera;

View File

@@ -218,7 +218,9 @@ KRPipeline *KRPipelineManager::getPipeline(KRSurface& surface, const PipelineInf
stream << "\n#define ALPHA_TEST " << (info.bAlphaTest ? "1" : "0"); stream << "\n#define ALPHA_TEST " << (info.bAlphaTest ? "1" : "0");
stream << "\n#define ALPHA_BLEND " << ((info.rasterMode == PipelineInfo::RasterMode::kAlphaBlend 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 ENABLE_PER_PIXEL " << (info.pCamera->settings.bEnablePerPixel ? "1" : "0");
stream << "\n#define DEBUG_PSSM " << (info.pCamera->settings.bDebugPSSM ? "1" : "0"); stream << "\n#define DEBUG_PSSM " << (info.pCamera->settings.bDebugPSSM ? "1" : "0");

View File

@@ -102,37 +102,29 @@ void KRPointLight::render(RenderInfo& ri)
info.pCamera = ri.camera; info.pCamera = ri.camera;
info.point_lights = &this_light; info.point_lights = &this_light;
info.renderPass = ri.renderPass; 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); 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())) { 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_COLOR, m_color);
pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_INTENSITY, m_intensity * 0.01f); 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_DECAY_START, getDecayStart());
pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_CUTOFF, KRLIGHT_MIN_INFLUENCE); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_CUTOFF, KRLIGHT_MIN_INFLUENCE);
pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_POSITION, light_position); pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_LIGHT_POSITION, light_position);
// Disable z-buffer write
GLDEBUG(glDepthMask(GL_FALSE));
if(bInsideLight) { if(bInsideLight) {
// Disable z-buffer test
GLDEBUG(glDisable(GL_DEPTH_TEST));
// Render a full screen quad // Render a full screen quad
m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); m_pContext->getMeshManager()->bindVBO(ri.commandBuffer, &m_pContext->getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f);
GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4));
} else { } else {
// Render sphere of light's influence // Render sphere of light's influence
generateMesh(); 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(glVertexAttribPointer(KRMesh::KRENGINE_ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, m_sphereVertices));
GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, m_cVertices)); GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, m_cVertices));

View File

@@ -140,14 +140,6 @@ void KRReverbZone::render(RenderInfo& ri)
info.rasterMode = PipelineInfo::RasterMode::kAdditive; 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())) { 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<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere"); std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
if(sphereModels.size()) { if(sphereModels.size()) {
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {

View File

@@ -276,8 +276,6 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, unordere
if(bNeedOcclusionTest) { if(bNeedOcclusionTest) {
pOctreeNode->beginOcclusionQuery(); pOctreeNode->beginOcclusionQuery();
Matrix4 matModel = Matrix4(); Matrix4 matModel = Matrix4();
matModel.scale(octreeBounds.size() * 0.5f); matModel.scale(octreeBounds.size() * 0.5f);
matModel.translate(octreeBounds.center()); 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); 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{}; PipelineInfo info{};
std::string shader_name("occlusion_test"); std::string shader_name("occlusion_test");
info.shader_name = &shader_name; 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)); GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14));
m_pContext->getMeshManager()->log_draw_call(ri.renderPass, "octree", "occlusion_test", 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(); pOctreeNode->endOcclusionQuery();

View File

@@ -138,20 +138,9 @@ void KRSprite::render(RenderInfo& ri) {
m_pSpriteTexture = getContext().getTextureManager()->getTexture(m_spriteTexture); m_pSpriteTexture = getContext().getTextureManager()->getTexture(m_spriteTexture);
} }
if(m_pSpriteTexture) { if(m_pSpriteTexture) {
/*
// Disable z-buffer write
GLDEBUG(glDepthMask(GL_FALSE));
*/
// TODO - Sprites are currently additive only. Need to expose this and allow for multiple blending modes // 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 // Render light sprite on transparency pass
PipelineInfo info{}; PipelineInfo info{};
std::string shader_name("sprite"); std::string shader_name("sprite");