From 579c4bcca11f935a9c7d95ff35a56e47c19ef22b Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Thu, 1 Aug 2024 00:23:14 +0200 Subject: [PATCH 1/5] Remove log message --- openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm | 1 - 1 file changed, 1 deletion(-) diff --git a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm index 07b14e3..08f5a10 100644 --- a/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm +++ b/openVulkanoCpp/AR/Provider/ArKit/ArSessionArKitInternal.mm @@ -228,7 +228,6 @@ namespace OpenVulkano::AR::ArKit } OnNewFrameAvailable(); m_frame = arFrame; - Logger::AR->info("Exposure: {}; ColTemp: {}", 1.0/frame.camera.exposureDuration, frame.lightEstimate.ambientColorTemperature); } void ArSessionArKitInternal::OnArSessionInterruptedChanged(ARSession* session, bool interrupted) From e54404ec61dd8100fac3fbf30f45b948a768b5a5 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Thu, 1 Aug 2024 10:29:07 +0200 Subject: [PATCH 2/5] Add code to allow for depth buffer query (Fixes #18) --- openVulkanoCpp/Base/Render/IRenderer.hpp | 3 + openVulkanoCpp/Vulkan/DepthBufferQuery.cpp | 96 ++++++++++++++++++++++ openVulkanoCpp/Vulkan/DepthBufferQuery.hpp | 48 +++++++++++ openVulkanoCpp/Vulkan/FrameBuffer.hpp | 2 + openVulkanoCpp/Vulkan/RenderPass.cpp | 4 +- openVulkanoCpp/Vulkan/Renderer.cpp | 9 ++ openVulkanoCpp/Vulkan/Renderer.hpp | 8 +- openVulkanoCpp/Vulkan/SwapChain.hpp | 17 +--- 8 files changed, 171 insertions(+), 16 deletions(-) create mode 100644 openVulkanoCpp/Vulkan/DepthBufferQuery.cpp create mode 100644 openVulkanoCpp/Vulkan/DepthBufferQuery.hpp diff --git a/openVulkanoCpp/Base/Render/IRenderer.hpp b/openVulkanoCpp/Base/Render/IRenderer.hpp index 3c01ef3..59d8dd7 100644 --- a/openVulkanoCpp/Base/Render/IRenderer.hpp +++ b/openVulkanoCpp/Base/Render/IRenderer.hpp @@ -35,5 +35,8 @@ namespace OpenVulkano virtual Scene::UI::Ui* GetActiveUi() = 0; virtual IResourceManager* GetIResourceManager() = 0; + + virtual float GetLastQueriedDepthValue() = 0; + virtual void SetQueryDepthValue(const Math::Vector2f& depthCoordinates) = 0; }; } diff --git a/openVulkanoCpp/Vulkan/DepthBufferQuery.cpp b/openVulkanoCpp/Vulkan/DepthBufferQuery.cpp new file mode 100644 index 0000000..98e200e --- /dev/null +++ b/openVulkanoCpp/Vulkan/DepthBufferQuery.cpp @@ -0,0 +1,96 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#include "DepthBufferQuery.hpp" +#include "Renderer.hpp" +#include + +//TODO resize + +namespace OpenVulkano::Vulkan +{ + void DepthBufferQuery::Init() + { + auto device = renderer.GetContext().device->device; + + vk::BufferCreateInfo bufferInfo = { {}, 25 * sizeof(float), vk::BufferUsageFlagBits::eTransferDst }; + bufferDepth = device.createBuffer(bufferInfo); + const vk::MemoryRequirements memRequirements = device.getBufferMemoryRequirements(bufferDepth); + size_t size = memRequirements.size; + const vk::MemoryAllocateInfo memAllocInfo = { size, renderer.GetContext().device->GetMemoryType(memRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible) }; + + memory = device.allocateMemory(memAllocInfo); + cpuDepthBuffer = static_cast(device.mapMemory(memory, 0, VK_WHOLE_SIZE, {})); + + device.bindBufferMemory(bufferDepth, memory, 0); + } + + void DepthBufferQuery::Close() + { + auto device = renderer.GetContext().device->device; + device.destroy(bufferDepth); + device.unmapMemory(memory); + device.free(memory); + cpuDepthBuffer = nullptr; + } + + void DepthBufferQuery::Resize(uint32_t width, uint32_t height) + { + //TODO + } + + float DepthBufferQuery::GetQueriedValue() const + { + if (cpuDepthBuffer[0] == -2) return -2; + if (cpuDepthBuffer[12] > 0 && cpuDepthBuffer[12] < 1) return cpuDepthBuffer[12]; + double val = 0; + int validCount = 0; + for (int i = 0; i < 25; i++) + { + float f = cpuDepthBuffer[i]; + if (f > 0 && f < 1) + { + val += f; + validCount++; + } + } + if (validCount == 0) return 1; // Prevent divide by 0 + return val / validCount; + } + + vk::Offset3D DepthBufferQuery::GetCopyOffset() const + { + vk::Extent3D depthExtent = renderer.GetContext().swapChain.GetCurrentDepthBuffer().extent; + + int32_t x = static_cast(depthQueryCoordinates.x * depthExtent.width); + x = std::min(depthExtent.width - 5, std::max(0, x)); + + int32_t y = static_cast(depthQueryCoordinates.y * depthExtent.height); + y = std::min(depthExtent.height - 5, std::max(0, y)); + + return { x, y, 0 }; + } + + void DepthBufferQuery::Encode(vk::CommandBuffer& commandBuffer) + { + if (!copyDepthBuffer) return; + copyDepthBuffer = false; + std::fill(cpuDepthBuffer, cpuDepthBuffer + 25, -2.0f); // Invalidate data in buffer to allow detecting if copy is done + const vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil; + const Image& depthBufferImage = renderer.GetContext().swapChain.GetCurrentDepthBuffer(); + + constexpr vk::Extent3D copySize = { 5, 5, 1 }; + const vk::ImageSubresourceLayers layout = { vk::ImageAspectFlagBits::eDepth, 0, 0, 1 }; + vk::BufferImageCopy imgCopy = { 0, 5, 5, layout, GetCopyOffset(), copySize }; + + const vk::ImageMemoryBarrier imgMemBarrier({}, vk::AccessFlagBits::eTransferRead, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eTransferSrcOptimal, 0, 0, depthBufferImage.image, vk::ImageSubresourceRange(aspectMask, 0, 1, 0, 1)); + commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, imgMemBarrier); + + commandBuffer.copyImageToBuffer(depthBufferImage.image, vk::ImageLayout::eTransferSrcOptimal, bufferDepth, 1, &imgCopy); + + depthBufferImage.SetLayout(commandBuffer, aspectMask, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eTransferSrcOptimal); + } +} diff --git a/openVulkanoCpp/Vulkan/DepthBufferQuery.hpp b/openVulkanoCpp/Vulkan/DepthBufferQuery.hpp new file mode 100644 index 0000000..167912d --- /dev/null +++ b/openVulkanoCpp/Vulkan/DepthBufferQuery.hpp @@ -0,0 +1,48 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "Math/Math.hpp" +#include "Vulkan/Image.hpp" + +namespace OpenVulkano::Vulkan +{ + class Renderer; + + class DepthBufferQuery final + { + Renderer& renderer; + vk::DeviceMemory memory; + vk::Buffer bufferDepth; + float* cpuDepthBuffer = nullptr; + Math::Vector2f depthQueryCoordinates = { 0.5f, 0.5f }; + bool copyDepthBuffer = true; + + vk::Offset3D GetCopyOffset() const; + + public: + DepthBufferQuery(Renderer& renderer): renderer(renderer) {} + + ~DepthBufferQuery() { if (cpuDepthBuffer != nullptr) Close(); } + + void Init(); + + void Close(); + + void Encode(vk::CommandBuffer& commandBuffer); + + void Resize(uint32_t width, uint32_t height); + + float GetQueriedValue() const; + + void SetQueryCoordinates(const Math::Vector2f& coords) + { + copyDepthBuffer = true; + depthQueryCoordinates = coords; + } + }; +} diff --git a/openVulkanoCpp/Vulkan/FrameBuffer.hpp b/openVulkanoCpp/Vulkan/FrameBuffer.hpp index fcf54eb..e9d68ca 100644 --- a/openVulkanoCpp/Vulkan/FrameBuffer.hpp +++ b/openVulkanoCpp/Vulkan/FrameBuffer.hpp @@ -90,5 +90,7 @@ namespace OpenVulkano::Vulkan [[nodiscard]] const vk::Viewport& GetFullscreenViewport() const { return fullscreenViewport; } [[nodiscard]] const vk::Rect2D& GetFullscreenScissor() const { return fullscreenScissor; } + + [[nodiscard]] const Image& GetCurrentDepthBuffer() { return depthBuffer; } }; } diff --git a/openVulkanoCpp/Vulkan/RenderPass.cpp b/openVulkanoCpp/Vulkan/RenderPass.cpp index b7afa50..979ed5f 100644 --- a/openVulkanoCpp/Vulkan/RenderPass.cpp +++ b/openVulkanoCpp/Vulkan/RenderPass.cpp @@ -57,7 +57,7 @@ namespace OpenVulkano::Vulkan if (m_frameBuffer->UseDepthBuffer()) { // Depth attachment attachments.emplace_back(vk::AttachmentDescriptionFlags(), m_frameBuffer->GetDepthFormat(), vk::SampleCountFlagBits::e1, - m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eDontCare, m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, + m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eStore, m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eDontCare, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal); depthReference = new vk::AttachmentReference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal); } @@ -87,4 +87,4 @@ namespace OpenVulkano::Vulkan { renderPass = m_device.createRenderPass(renderPassCreateInfo); } -} \ No newline at end of file +} diff --git a/openVulkanoCpp/Vulkan/Renderer.cpp b/openVulkanoCpp/Vulkan/Renderer.cpp index 18e94a8..9931420 100644 --- a/openVulkanoCpp/Vulkan/Renderer.cpp +++ b/openVulkanoCpp/Vulkan/Renderer.cpp @@ -18,6 +18,11 @@ namespace OpenVulkano::Vulkan { + Renderer::Renderer() + : depthBufferQuery(*this) + { + } + void Renderer::Init(IGraphicsAppManager* graphicsAppManager, IWindow* window) { logger = Logger::RENDER; @@ -62,6 +67,8 @@ namespace OpenVulkano::Vulkan } } + depthBufferQuery.Init(); + logger->info("Vulkan renderer initialized"); } @@ -87,6 +94,7 @@ namespace OpenVulkano::Vulkan closeables.pop_back(); closeable->Close(); } + depthBufferQuery.Close(); uiRenderer.Close(); resourceManager.Close(); commands.clear(); @@ -138,6 +146,7 @@ namespace OpenVulkano::Vulkan CommandHelper* cmdHelper = GetCommandData(commands.size() - 1); cmdHelper->cmdBuffer.executeCommands(submitBuffers[currentImageId].size(), submitBuffers[currentImageId].data()); context.swapChainRenderPass.End(cmdHelper->cmdBuffer); + depthBufferQuery.Encode(cmdHelper->cmdBuffer); uiRenderer.DrawUiFrame(cmdHelper->cmdBuffer); cmdHelper->cmdBuffer.end(); std::array stateFlags = { vk::PipelineStageFlags(vk::PipelineStageFlagBits::eColorAttachmentOutput), vk::PipelineStageFlags(vk::PipelineStageFlagBits::eColorAttachmentOutput) }; diff --git a/openVulkanoCpp/Vulkan/Renderer.hpp b/openVulkanoCpp/Vulkan/Renderer.hpp index 5740256..064e1c6 100644 --- a/openVulkanoCpp/Vulkan/Renderer.hpp +++ b/openVulkanoCpp/Vulkan/Renderer.hpp @@ -16,6 +16,7 @@ #include "CommandHelper.hpp" #include "Base/EngineConfiguration.hpp" #include "Resources/ResourceManager.hpp" +#include "DepthBufferQuery.hpp" #include #include @@ -40,9 +41,10 @@ namespace OpenVulkano::Vulkan std::vector> submitBuffers; UiRenderer uiRenderer; std::vector closeables; + DepthBufferQuery depthBufferQuery; public: - Renderer() = default; + Renderer(); ~Renderer() override = default; void Init(IGraphicsAppManager* graphicsAppManager, IWindow* window) override; @@ -86,5 +88,9 @@ namespace OpenVulkano::Vulkan void UnregisterCloseable(ICloseable* closeable) { Utils::Remove(closeables, closeable); } IResourceManager* GetIResourceManager() override { return &resourceManager; } + + + float GetLastQueriedDepthValue() override { return depthBufferQuery.GetQueriedValue(); } + void SetQueryDepthValue(const Math::Vector2f& depthCoordinates) override { depthBufferQuery.SetQueryCoordinates(depthCoordinates); } }; } diff --git a/openVulkanoCpp/Vulkan/SwapChain.hpp b/openVulkanoCpp/Vulkan/SwapChain.hpp index 0841437..934b705 100644 --- a/openVulkanoCpp/Vulkan/SwapChain.hpp +++ b/openVulkanoCpp/Vulkan/SwapChain.hpp @@ -45,7 +45,7 @@ namespace OpenVulkano vk::PresentModeKHR presentMode; std::vector imageAvailableSemaphores; uint32_t currentSemaphoreId = 0; - vk::Extent2D size{0,0}; + vk::Extent2D size{ 0, 0 }; public: vk::SwapchainKHR swapChain; @@ -59,10 +59,7 @@ namespace OpenVulkano void Resize(uint32_t newWidth, uint32_t newHeight); - [[nodiscard]] vk::Extent2D GetSize() const - { - return size; - } + [[nodiscard]] vk::Extent2D GetSize() const { return size; } uint32_t AcquireNextImage(const vk::Fence& fence = vk::Fence()); @@ -81,10 +78,7 @@ namespace OpenVulkano } } - [[nodiscard]] uint32_t GetImageCount() const - { - return images.size(); - } + [[nodiscard]] uint32_t GetImageCount() const { return images.size(); } vk::Semaphore& GetCurrentSemaphore() { return imageAvailableSemaphores[currentSemaphoreId]; } @@ -96,10 +90,7 @@ namespace OpenVulkano void DestroySwapChain(); protected: - vk::Format FindColorFormat() override - { - return surfaceFormat.format; - } + [[nodiscard]] vk::Format FindColorFormat() override { return surfaceFormat.format; } virtual vk::PresentModeKHR ChosePresentMode(); From 95627fe53a13f0dd54cd2c1d75cfa8b0a19f461d Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Thu, 1 Aug 2024 11:12:01 +0200 Subject: [PATCH 3/5] Fix shader Close --- openVulkanoCpp/Scene/Shader/Shader.hpp | 2 +- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openVulkanoCpp/Scene/Shader/Shader.hpp b/openVulkanoCpp/Scene/Shader/Shader.hpp index 2befe3e..ed1da7d 100644 --- a/openVulkanoCpp/Scene/Shader/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader/Shader.hpp @@ -96,7 +96,7 @@ namespace OpenVulkano::Scene bool dynamicViewport = true; // If disabled the swapchains fullscreen viewport will always be used, regardless of framebuffer or viewport Shader() = default; - ~Shader() override { /*if (renderShader) Shader::Close();*/ } + ~Shader() override { if (renderShader) Shader::Close(); } Shader& AddShaderProgram(const ShaderProgram& shaderProgram) { diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index 3ac50d0..b675728 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -17,8 +17,15 @@ namespace OpenVulkano::Vulkan VulkanShader::~VulkanShader() { - if (!shader) return; - Close(); + if (shader) Close(); + device.destroyPipeline(pipeline); + for(auto& shaderModule : shaderModules) + { + device.destroyShaderModule(shaderModule); + } + device.destroyPipelineLayout(pipelineLayout); + for(auto& descriptorSetLayout : descriptorSetLayouts) + device.destroyDescriptorSetLayout(descriptorSetLayout); } void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner) @@ -125,16 +132,9 @@ namespace OpenVulkano::Vulkan void VulkanShader::Close() { shader->renderShader = nullptr; - device.destroyPipeline(pipeline); - for(auto& shaderModule : shaderModules) - { - device.destroyShaderModule(shaderModule); - } - device.destroyPipelineLayout(pipelineLayout); - for(auto& descriptorSetLayout : descriptorSetLayouts) - device.destroyDescriptorSetLayout(descriptorSetLayout); shader = nullptr; if (owner) owner->RemoveShader(this); + owner = nullptr; } void VulkanShader::CreatePipelineLayout() From 0754cdf072bc2bd4c15bf5bc5be3a9a41281eb47 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Thu, 1 Aug 2024 11:27:59 +0200 Subject: [PATCH 4/5] Silence some warnings --- openVulkanoCpp/Vulkan/Renderer.cpp | 4 ++-- openVulkanoCpp/Vulkan/Renderer.hpp | 4 ++-- openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp | 4 ++-- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openVulkanoCpp/Vulkan/Renderer.cpp b/openVulkanoCpp/Vulkan/Renderer.cpp index 9931420..a6f4a7b 100644 --- a/openVulkanoCpp/Vulkan/Renderer.cpp +++ b/openVulkanoCpp/Vulkan/Renderer.cpp @@ -114,7 +114,7 @@ namespace OpenVulkano::Vulkan resourceManager.Resize(); } - CommandHelper* Renderer::GetCommandData(uint32_t poolId) + CommandHelper* Renderer::GetCommandData(size_t poolId) { return &commands[poolId][currentImageId]; } @@ -173,7 +173,7 @@ namespace OpenVulkano::Vulkan Submit(); } - void Renderer::RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue* jobQueue, uint32_t poolId) + void Renderer::RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue* jobQueue, size_t poolId) { CommandHelper* cmdHelper = GetCommandData(poolId); cmdHelper->Reset(); diff --git a/openVulkanoCpp/Vulkan/Renderer.hpp b/openVulkanoCpp/Vulkan/Renderer.hpp index 064e1c6..718356d 100644 --- a/openVulkanoCpp/Vulkan/Renderer.hpp +++ b/openVulkanoCpp/Vulkan/Renderer.hpp @@ -65,7 +65,7 @@ namespace OpenVulkano::Vulkan Scene::UI::Ui* GetActiveUi() override { return uiRenderer.GetActiveUi(); } - CommandHelper* GetCommandData(uint32_t poolId); + CommandHelper* GetCommandData(size_t poolId); static void RunThread(Renderer* renderer, Data::ReadOnlyAtomicArrayQueue* jobQueue, uint32_t id); @@ -77,7 +77,7 @@ namespace OpenVulkano::Vulkan void Render(); - void RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue* jobQueue, uint32_t poolId); + void RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue* jobQueue, size_t poolId); ResourceManager& GetResourceManager() { return resourceManager; } diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp index 998a7fc..7689741 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp @@ -55,7 +55,7 @@ namespace OpenVulkano::Vulkan * \return The pointer to the mapped buffer. */ template - T* Map(size_t offset = 0, vk::DeviceSize size = VK_WHOLE_SIZE, bool longTermMapping = true) + T* Map(vk::DeviceSize offset = 0, vk::DeviceSize size = VK_WHOLE_SIZE, bool longTermMapping = true) { if (!mapped) { @@ -106,7 +106,7 @@ namespace OpenVulkano::Vulkan } } - void Copy(const void* data, uint32_t size, uint32_t offset) + void Copy(const void* data, vk::DeviceSize size, vk::DeviceSize offset) { if(mapped) memcpy(static_cast(mapped) + offset, data, size); else diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index b675728..fc851aa 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -70,12 +70,12 @@ namespace OpenVulkano::Vulkan if (shader->vertexInputDescriptions.size() == 1) { // Reuse already existing vertex attribute description static_assert(sizeof(VertexInputParameter) == sizeof(vk::VertexInputAttributeDescription)); - attributeDescriptionsSize = shader->vertexInputDescriptions[0].inputParameters.size(); + attributeDescriptionsSize = static_cast(shader->vertexInputDescriptions[0].inputParameters.size()); attributeDescriptionsData = reinterpret_cast(shader->vertexInputDescriptions[0].inputParameters.data()); } else { - attributeDescriptionsSize = attributeDescriptions.size(); + attributeDescriptionsSize = static_cast(attributeDescriptions.size()); attributeDescriptionsData = attributeDescriptions.data(); } From 5bd46074a93ab0cd621411c7ebedfc7f7a4fae00 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Thu, 1 Aug 2024 13:02:36 +0200 Subject: [PATCH 5/5] Add definitions for some common sampler settings --- openVulkanoCpp/Scene/SamplerConfig.cpp | 9 ++++++++- openVulkanoCpp/Scene/SamplerConfig.hpp | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Scene/SamplerConfig.cpp b/openVulkanoCpp/Scene/SamplerConfig.cpp index 43443b9..ef11576 100644 --- a/openVulkanoCpp/Scene/SamplerConfig.cpp +++ b/openVulkanoCpp/Scene/SamplerConfig.cpp @@ -9,4 +9,11 @@ namespace OpenVulkano::Scene { const SamplerConfig SamplerConfig::DEFAULT; -} \ No newline at end of file + const SamplerConfig SamplerConfig::NEAREST(TextureSamplerFilter::NEAREST, TextureSamplerFilter::NEAREST); + const SamplerConfig SamplerConfig::LINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::NEAREST); + const SamplerConfig SamplerConfig::BILINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR); + const SamplerConfig SamplerConfig::TIRILINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR); + const SamplerConfig SamplerConfig::ANISOTROPIC_LOW(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 4); + const SamplerConfig SamplerConfig::ANISOTROPIC_HIGH(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 16); + const SamplerConfig SamplerConfig::ANISOTROPIC_PRO(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 32); +} diff --git a/openVulkanoCpp/Scene/SamplerConfig.hpp b/openVulkanoCpp/Scene/SamplerConfig.hpp index c5d1887..7953abb 100644 --- a/openVulkanoCpp/Scene/SamplerConfig.hpp +++ b/openVulkanoCpp/Scene/SamplerConfig.hpp @@ -79,11 +79,26 @@ namespace OpenVulkano::Scene , compareEnabled(compareEnabled), compareOp(compareOp) , minLod(minLod), maxLod(maxLod), borderColor(borderColor), unnormalizedCoordinates(unnormalizedCoordinates) {} + + SamplerConfig(TextureSamplerFilter magFilter, TextureSamplerFilter minFilter = TextureSamplerFilter::LINEAR, + TextureSamplerMipmapMode mipmapMode = TextureSamplerMipmapMode::NEAREST, + bool32_t anisotropyEnabled = false, float maxAnisotropy = 0) + : magFilter(magFilter), minFilter(minFilter), mipmapMode(mipmapMode), anisotropyEnabled(anisotropyEnabled), maxAnisotropy(maxAnisotropy) + {} auto operator <=>(const SamplerConfig& other) const = default; public: // Default configs static const SamplerConfig DEFAULT; + static const SamplerConfig NEAREST; + static const SamplerConfig LINEAR; + static const SamplerConfig BILINEAR; + static const SamplerConfig TIRILINEAR; + static const SamplerConfig ANISOTROPIC_LOW; + static const SamplerConfig ANISOTROPIC_HIGH; + + // Not supported on most consumer grphics cards! + static const SamplerConfig ANISOTROPIC_PRO; }; }