From b079221322fb479632874922c4e5ec98bdbd6ccb Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 30 Jul 2024 22:16:00 +0200 Subject: [PATCH] Allow shader to define the depth compare operator --- .../Scene/Prefabs/ArBackgroundDrawable.cpp | 1 + openVulkanoCpp/Scene/Shader/Shader.hpp | 13 +++++++++++++ openVulkanoCpp/Shader/background.vert | 3 +-- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/openVulkanoCpp/Scene/Prefabs/ArBackgroundDrawable.cpp b/openVulkanoCpp/Scene/Prefabs/ArBackgroundDrawable.cpp index 7772469..32c75e8 100644 --- a/openVulkanoCpp/Scene/Prefabs/ArBackgroundDrawable.cpp +++ b/openVulkanoCpp/Scene/Prefabs/ArBackgroundDrawable.cpp @@ -25,6 +25,7 @@ namespace OpenVulkano::Scene m_shader.AddShaderProgram(ShaderProgramType::FRAGMENT, "Shader/background"); m_shader.AddDescriptorSetLayoutBinding(UniformBuffer::DESCRIPTOR_SET_LAYOUT_BINDING); m_shader.AddDescriptorSetLayoutBinding(Texture::DESCRIPTOR_SET_LAYOUT_BINDING); + m_shader.depthCompareOp = CompareOp::LESS_OR_EQUAL; SetShader(&m_shader); m_intrinsicsBuffer.Init(sizeof(Math::CameraIntrinsicWithResolution), &FALLBACK_INTRINSICS); m_intrinsicsBuffer.updateFrequency = UpdateFrequency::Always; diff --git a/openVulkanoCpp/Scene/Shader/Shader.hpp b/openVulkanoCpp/Scene/Shader/Shader.hpp index e743e8a..2befe3e 100644 --- a/openVulkanoCpp/Scene/Shader/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader/Shader.hpp @@ -40,6 +40,18 @@ namespace OpenVulkano::Scene PATCH_LIST }; + enum class CompareOp : uint32_t + { + NEVER = 0, + LESS = 1, + EQUAL = 2, + LESS_OR_EQUAL = 3, + GREATER = 4, + NOT_EQUAL = 5, + GREATER_OR_EQUAL = 6, + ALWAYS = 7 + }; + struct ShaderProgram { ShaderProgramType type; @@ -77,6 +89,7 @@ namespace OpenVulkano::Scene Topology topology = Topology::TRIANGLE_LIST; CullMode cullMode = CullMode::BACK; ICloseable* renderShader = nullptr; + CompareOp depthCompareOp = CompareOp::LESS; bool alphaBlend = false; // TODO allow fine control over blending bool depthTest = true; bool depthWrite = true; diff --git a/openVulkanoCpp/Shader/background.vert b/openVulkanoCpp/Shader/background.vert index f6a52ae..5ccb9c3 100644 --- a/openVulkanoCpp/Shader/background.vert +++ b/openVulkanoCpp/Shader/background.vert @@ -27,10 +27,9 @@ layout(set = 2, binding = 0) uniform RealCameraData layout(location = 0) out vec2 textureCoordinates; layout(location = 1) out float scaleOut; -const float FLOAT_MAX_LESS_THAN_1 = 0.999999940395355224609; // Background plane positions are in clipped space const vec4 PLANE[4] = vec4[]( - vec4(1, -1, FLOAT_MAX_LESS_THAN_1, 1), vec4(-1, -1, FLOAT_MAX_LESS_THAN_1, 1), vec4(1, 1, FLOAT_MAX_LESS_THAN_1, 1), vec4(-1, 1, FLOAT_MAX_LESS_THAN_1, 1) + vec4(1, -1, 1, 1), vec4(-1, -1, 1, 1), vec4(1, 1, 1, 1), vec4(-1, 1, 1, 1) ); const vec2 TEX_COORDS[4] = vec2[]( vec2(1, 0), vec2(0, 0), vec2(1, 1), vec2(0, 1) diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index 2add4f8..3ac50d0 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -80,7 +80,7 @@ namespace OpenVulkano::Vulkan vk::PipelineRasterizationStateCreateInfo rasterizer = {}; rasterizer.cullMode = static_cast(shader->cullMode); vk::PipelineMultisampleStateCreateInfo msaa = {}; - vk::PipelineDepthStencilStateCreateInfo depth = { {}, shader->depthTest, shader->depthWrite, vk::CompareOp::eLess }; + vk::PipelineDepthStencilStateCreateInfo depth = { {}, shader->depthTest, shader->depthWrite, static_cast(shader->depthCompareOp) }; depth.maxDepthBounds = 1; vk::PipelineColorBlendAttachmentState colorBlendAttachment = {}; colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eA | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eR;