diff --git a/openVulkanoCpp/Scene/Prefabs/LabelDrawable.cpp b/openVulkanoCpp/Scene/Prefabs/LabelDrawable.cpp index 48fdf08..001dec1 100644 --- a/openVulkanoCpp/Scene/Prefabs/LabelDrawable.cpp +++ b/openVulkanoCpp/Scene/Prefabs/LabelDrawable.cpp @@ -58,6 +58,7 @@ namespace OpenVulkano::Scene billboardUniformBinding.stageFlags = ShaderProgramType::Type::VERTEX; shader.AddDescriptorSetLayoutBinding(billboardUniformBinding, 4); } + shader.EnableDepthBias(); return shader; } diff --git a/openVulkanoCpp/Scene/Shader/Shader.hpp b/openVulkanoCpp/Scene/Shader/Shader.hpp index 1ff0a54..aec8bc9 100644 --- a/openVulkanoCpp/Scene/Shader/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader/Shader.hpp @@ -81,7 +81,6 @@ namespace OpenVulkano::Scene }; - class Shader final : public RenderResourceHolder, public ICloseable { public: @@ -96,6 +95,8 @@ namespace OpenVulkano::Scene bool depthTest = true; bool depthWrite = true; bool dynamicViewport = true; // If disabled the swapchains fullscreen viewport will always be used, regardless of framebuffer or viewport + bool depthBias = false; + float depthBiasClamp = 0.0f, depthBiasSlope = 0.0f, depthBiasConstant = 0.0f; Shader() = default; ~Shader() override { Shader::Close(); } @@ -128,6 +129,7 @@ namespace OpenVulkano::Scene { CheckShaderInitState(); if (bindingId < 0) bindingId = static_cast(vertexInputDescriptions.size()); + // ReSharper disable once CppDFALoopConditionNotUpdated while (bindingId > static_cast(vertexInputDescriptions.size())) { vertexInputDescriptions.emplace_back(0, 0); @@ -149,6 +151,7 @@ namespace OpenVulkano::Scene if (setId < 0) setId = static_cast(descriptorSets.size() + 2); if (setId < 2) throw std::runtime_error("Cant bind set id 0 or 1! They are used for node and camera!"); setId -= 2; + // ReSharper disable once CppDFALoopConditionNotUpdated while (setId >= static_cast(descriptorSets.size())) { descriptorSets.emplace_back(); @@ -163,6 +166,13 @@ namespace OpenVulkano::Scene pushConstantRanges.push_back(pushConstantRange); } + void EnableDepthBias(const float slope = -1.0, const float constant = 0.001f) + { + depthBias = true; + depthBiasSlope = slope; + depthBiasConstant = constant; + } + void Close() override { if (HasRenderResource()) diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index c1046ce..db0542b 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -84,6 +84,13 @@ namespace OpenVulkano::Vulkan vk::PipelineInputAssemblyStateCreateInfo inputAssembly = { {}, static_cast(shader->topology), 0 }; vk::PipelineRasterizationStateCreateInfo rasterizer = {}; rasterizer.cullMode = static_cast(shader->cullMode); + if (shader->depthBias) + { + rasterizer.depthBiasEnable = VK_TRUE; + rasterizer.depthBiasClamp = shader->depthBiasClamp; + rasterizer.depthBiasConstantFactor = shader->depthBiasConstant; + rasterizer.depthBiasSlopeFactor = shader->depthBiasSlope; + } vk::PipelineMultisampleStateCreateInfo msaa = {}; vk::PipelineDepthStencilStateCreateInfo depth = { {}, shader->depthTest, shader->depthWrite, static_cast(shader->depthCompareOp) }; depth.maxDepthBounds = 1; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp index 738e0c2..8ece2c3 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp @@ -11,39 +11,36 @@ #include #include -namespace OpenVulkano +namespace OpenVulkano::Vulkan { - namespace Vulkan - { - class Context; - class IShaderOwner; + class Context; + class IShaderOwner; class VulkanShader final : public IRenderResource, public IRecordable - { - public: - vk::Device device; - std::vector shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs - std::vector shaderStageCreateInfo; - vk::Pipeline pipeline; // TODO pipeline and shader config should be split - std::vector descriptorSetLayouts; - vk::PipelineLayout pipelineLayout; - IShaderOwner* owner = nullptr; - Context* context = nullptr; + { + public: + vk::Device device; + std::vector shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs + std::vector shaderStageCreateInfo; + vk::Pipeline pipeline; // TODO pipeline and shader config should be split + std::vector descriptorSetLayouts; + vk::PipelineLayout pipelineLayout; + IShaderOwner* owner = nullptr; + Context* context = nullptr; - VulkanShader(Context* context, Scene::Shader* shader, IShaderOwner* owner); + VulkanShader(Context* context, Scene::Shader* shader, IShaderOwner* owner); - ~VulkanShader() override; + ~VulkanShader() override; - void Resize(); + void Resize(); - void Record(VulkanDrawContext* context) override; + void Record(VulkanDrawContext* context) override; - void Release() override; + void Release() override; - private: - void BuildPipeline(); + private: + void BuildPipeline(); - void CreatePipelineLayout(); - }; - } + void CreatePipelineLayout(); + }; } \ No newline at end of file