diff --git a/CopiumEngine/CopiumEngine.vcxproj b/CopiumEngine/CopiumEngine.vcxproj
index 72a6a62..4490e3e 100644
--- a/CopiumEngine/CopiumEngine.vcxproj
+++ b/CopiumEngine/CopiumEngine.vcxproj
@@ -171,7 +171,8 @@
-
+
+
@@ -194,7 +195,7 @@
-
+
@@ -208,7 +209,8 @@
-
+
+
@@ -234,7 +236,7 @@
-
+
diff --git a/CopiumEngine/CopiumEngine.vcxproj.filters b/CopiumEngine/CopiumEngine.vcxproj.filters
index 92cb79d..502c68b 100644
--- a/CopiumEngine/CopiumEngine.vcxproj.filters
+++ b/CopiumEngine/CopiumEngine.vcxproj.filters
@@ -120,10 +120,13 @@
Source Files
-
+
Source Files
-
+
+ Source Files
+
+
Source Files
@@ -236,10 +239,13 @@
Header Files
-
+
Header Files
-
+
+ Header Files
+
+
Header Files
diff --git a/CopiumEngine/res/shaders/renderer.vert b/CopiumEngine/res/shaders/renderer.vert
index 8f4a857..c7fdfa9 100644
--- a/CopiumEngine/res/shaders/renderer.vert
+++ b/CopiumEngine/res/shaders/renderer.vert
@@ -1,6 +1,6 @@
#version 450
-layout(location = 0) in vec3 inPosition;
+layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 2) in vec2 inTexCoord;
layout(location = 3) in int inTexIndex;
@@ -9,9 +9,15 @@ layout(location = 0) out vec3 fragColor;
layout(location = 1) out vec2 fragTexCoord;
layout(location = 2) out int fragTexIndex;
+layout(set = 1, binding = 0) uniform SceneUniformBufferObject
+{
+ mat4 projection;
+ mat4 view;
+} ubo;
+
void main()
{
- gl_Position = vec4(inPosition, 1.0);
+ gl_Position = ubo.projection * ubo.view * vec4(inPosition, 0.0, 1.0);
fragColor = inColor;
fragTexCoord = inTexCoord;
fragTexIndex = inTexIndex;
diff --git a/CopiumEngine/src/copium/buffer/UniformBuffer.cpp b/CopiumEngine/src/copium/buffer/UniformBuffer.cpp
index a9dbf52..ef362c9 100644
--- a/CopiumEngine/src/copium/buffer/UniformBuffer.cpp
+++ b/CopiumEngine/src/copium/buffer/UniformBuffer.cpp
@@ -4,9 +4,11 @@
namespace Copium
{
- UniformBuffer::UniformBuffer(Vulkan& vulkan, VkDeviceSize size)
- : Buffer{vulkan, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, SwapChain::MAX_FRAMES_IN_FLIGHT}
- {}
+ UniformBuffer::UniformBuffer(Vulkan& vulkan, ShaderBinding binding)
+ : Buffer{vulkan, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, binding.GetUniformBufferSize(), SwapChain::MAX_FRAMES_IN_FLIGHT}, binding{binding}
+ {
+ buffer.resize(Buffer::GetSize());
+ }
VkDescriptorBufferInfo UniformBuffer::GetDescriptorBufferInfo(int index) const
{
@@ -16,4 +18,58 @@ namespace Copium
bufferInfo.range = size;
return bufferInfo;
}
+
+ void UniformBuffer::Set(const std::string& str, const glm::mat3& data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Mat3, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(glm::mat3));
+ }
+
+ void UniformBuffer::Set(const std::string& str, const glm::mat4& data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Mat4, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(glm::mat4));
+ }
+
+ void UniformBuffer::Set(const std::string& str, const glm::vec2& data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Vec2, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(glm::vec2));
+ }
+
+ void UniformBuffer::Set(const std::string& str, const glm::vec3& data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Vec3, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(glm::vec3));
+ }
+
+ void UniformBuffer::Set(const std::string& str, const glm::vec4& data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Vec4, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(glm::vec4));
+ }
+
+ void UniformBuffer::Set(const std::string& str, float data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Float, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(float));
+ }
+
+ void UniformBuffer::Set(const std::string& str, int data)
+ {
+ CP_ASSERT(binding.GetUniformType(str) == UniformType::Int, "Set : Uniform type missmatch = %s", str.c_str());
+ uint32_t offset = binding.GetUniformOffset(str);
+ memcpy(buffer.data() + offset, &data, sizeof(int));
+ }
+
+ void UniformBuffer::Update()
+ {
+ Buffer::Update(buffer.data(), vulkan.GetSwapChain().GetFlightIndex());
+ }
}
\ No newline at end of file
diff --git a/CopiumEngine/src/copium/buffer/UniformBuffer.h b/CopiumEngine/src/copium/buffer/UniformBuffer.h
index 6ab9498..1e0104c 100644
--- a/CopiumEngine/src/copium/buffer/UniformBuffer.h
+++ b/CopiumEngine/src/copium/buffer/UniformBuffer.h
@@ -2,8 +2,10 @@
#include "copium/buffer/Buffer.h"
#include "copium/core/Vulkan.h"
+#include "copium/pipeline/ShaderBinding.h"
#include "copium/util/Common.h"
+#include
#include
namespace Copium
@@ -12,20 +14,22 @@ namespace Copium
{
CP_DELETE_COPY_AND_MOVE_CTOR(UniformBuffer);
+ ShaderBinding binding;
+ std::vector buffer;
+
public:
- UniformBuffer(Vulkan& vulkan, VkDeviceSize size);
+ UniformBuffer(Vulkan& vulkan, ShaderBinding binding);
VkDescriptorBufferInfo GetDescriptorBufferInfo(int index) const;
- template
- void Update(const T& t);
+ void Set(const std::string& str, const glm::mat3& data);
+ void Set(const std::string& str, const glm::mat4& data);
+ void Set(const std::string& str, const glm::vec2& data);
+ void Set(const std::string& str, const glm::vec3& data);
+ void Set(const std::string& str, const glm::vec4& data);
+ void Set(const std::string& str, float data);
+ void Set(const std::string& str, int data);
+ void Update();
};
-
- template
- void UniformBuffer::Update(const T& t)
- {
- CP_ASSERT(sizeof(T) == Buffer::GetSize(), "Update : Template size is not the same as buffer size %u != %u", sizeof(T), Buffer::GetSize());
- Buffer::Update((void*)&t, vulkan.GetSwapChain().GetFlightIndex());
- }
}
diff --git a/CopiumEngine/src/copium/core/Application.cpp b/CopiumEngine/src/copium/core/Application.cpp
index 6f1388c..e9da293 100644
--- a/CopiumEngine/src/copium/core/Application.cpp
+++ b/CopiumEngine/src/copium/core/Application.cpp
@@ -38,25 +38,16 @@ namespace Copium
0, 1, 2, 2, 3, 0,
};
- struct alignas(64) ShaderUniform
- {
- alignas(16) glm::mat4 projection;
- alignas(16) glm::mat4 view;
- alignas(16) glm::mat4 model;
- alignas(16) glm::vec3 lightPos;
- };
-
Application::Application()
{
InitializeVulkan();
InitializeFrameBuffer();
+ InitializeRenderer();
InitializeGraphicsPipeline();
InitializeTextureSampler();
- InitializeUniformBuffer();
InitializeDescriptorSets();
InitializeMesh();
InitializeCommandBuffer();
- InitializeRenderer();
}
Application::~Application()
@@ -97,27 +88,28 @@ namespace Copium
framebuffer = std::make_unique(*vulkan, vulkan->GetSwapChain().GetExtent().width, vulkan->GetSwapChain().GetExtent().height);
}
+ void Application::InitializeRenderer()
+ {
+ renderer = std::make_unique(*vulkan, framebuffer->GetRenderPass(), *descriptorPool);
+ }
+
void Application::InitializeTextureSampler()
{
texture2D = std::make_unique(*vulkan, "res/textures/texture.png");
texture2D2 = std::make_unique(*vulkan, "res/textures/texture2.png");
}
- void Application::InitializeUniformBuffer()
- {
- shaderUniformBuffer = std::make_unique(*vulkan, sizeof(ShaderUniform));
- }
-
void Application::InitializeDescriptorSets()
{
descriptorPool = std::make_unique(*vulkan);
- descriptorSet = std::make_unique(*vulkan, *descriptorPool, graphicsPipeline->GetDescriptorSetLayout(0));
- descriptorSet->SetUniformBuffer(*shaderUniformBuffer, 0);
+ descriptorSet = graphicsPipeline->CreateDescriptorSet(*descriptorPool, 0);
descriptorSet->SetSampler(*texture2D, 1);
- descriptorSetPassthrough = std::make_unique(*vulkan, *descriptorPool, graphicsPipelinePassthrough->GetDescriptorSetLayout(0));
+ descriptorSetPassthrough = graphicsPipelinePassthrough->CreateDescriptorSet(*descriptorPool, 0);
descriptorSetPassthrough->SetSampler(framebuffer->GetColorAttachment(), 0);
+
+ descriptorSetRenderer = renderer->GetGraphicsPipeline().CreateDescriptorSet(*descriptorPool, 1);
}
void Application::InitializeGraphicsPipeline()
@@ -142,11 +134,6 @@ namespace Copium
commandBuffer = std::make_unique(*vulkan, CommandBuffer::Type::Dynamic);
}
- void Application::InitializeRenderer()
- {
- renderer = std::make_unique(*vulkan, framebuffer->GetRenderPass(), *descriptorPool);
- }
-
void Application::RecordCommandBuffer()
{
commandBuffer->Begin();
@@ -156,22 +143,23 @@ namespace Copium
UpdateUniformBuffer();
- graphicsPipeline->SetDescriptorSet(0, *descriptorSet);
+ graphicsPipeline->SetDescriptorSet(*descriptorSet);
graphicsPipeline->BindDescriptorSets(*commandBuffer);
mesh->Bind(*commandBuffer);
mesh->Render(*commandBuffer);
+ renderer->SetDescriptorSet(*descriptorSetRenderer);
renderer->Begin(*commandBuffer);
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
- renderer->Quad(glm::vec2{-1 + x * 0.2, -1 + y * 0.2}, glm::vec2{-1 + (x + 0.5) * 0.2, -1 + (y + 0.5) * 0.2}, glm::vec3{x * 0.1, y * 0.1, 1.0});
+ renderer->Quad(glm::vec2{-1 + x * 0.2 + 0.05, -1 + y * 0.2 + 0.05}, glm::vec2{0.1, 0.1}, glm::vec3{x * 0.1, y * 0.1, 1.0});
}
}
- renderer->Quad(glm::vec2{-0.5, -0.5}, glm::vec2{-0.1, 0.5}, *texture2D);
- renderer->Quad(glm::vec2{0.1, -0.5}, glm::vec2{0.5, 0.5}, *texture2D2);
+ renderer->Quad(glm::vec2{-0.9, -0.4}, glm::vec2{0.8, 0.8}, *texture2D);
+ renderer->Quad(glm::vec2{ 0.1, -0.4}, glm::vec2{0.8, 0.8}, *texture2D2);
renderer->End();
framebuffer->Unbind(*commandBuffer);
@@ -179,7 +167,7 @@ namespace Copium
vulkan->GetSwapChain().BeginFrameBuffer(*commandBuffer);
graphicsPipelinePassthrough->Bind(*commandBuffer);
- graphicsPipelinePassthrough->SetDescriptorSet(0, *descriptorSetPassthrough);
+ graphicsPipelinePassthrough->SetDescriptorSet(*descriptorSetPassthrough);
graphicsPipelinePassthrough->BindDescriptorSets(*commandBuffer);
meshPassthrough->Bind(*commandBuffer);
@@ -194,13 +182,25 @@ namespace Copium
static Timer startTimer;
float time = startTimer.Elapsed();
- ShaderUniform shaderUniform;
- shaderUniform.view = glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
- shaderUniform.projection = glm::perspective(glm::radians(45.0f), framebuffer->GetWidth() / (float)framebuffer->GetHeight(), 0.1f, 10.0f);
- shaderUniform.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 1.0f, 0.0f));
- shaderUniform.projection[1][1] *= -1;
- shaderUniform.lightPos = glm::rotate(glm::mat4{1.0f}, time * glm::radians(45.0f), glm::vec3(0, 1, 0)) * glm::vec4{0.3, 0.1, 0, 1};
+ float aspect = framebuffer->GetWidth() / (float)framebuffer->GetHeight();
- shaderUniformBuffer->Update(shaderUniform);
+ {
+ glm::mat4 projection = glm::perspective(glm::radians(45.0f), aspect, 0.1f, 10.0f);
+ projection[1][1] *= -1;
+
+ UniformBuffer& uniformBuffer = descriptorSet->GetUniformBuffer("ubo");
+ uniformBuffer.Set("projection", projection);
+ uniformBuffer.Set("view", glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)));
+ uniformBuffer.Set("model", glm::rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 1.0f, 0.0f)));
+ uniformBuffer.Set("lightPos", (glm::vec3)(glm::rotate(glm::mat4{1.0f}, time * glm::radians(45.0f), glm::vec3(0, 1, 0)) * glm::vec4{0.3, 0.1, 0, 1}));
+ uniformBuffer.Update();
+ }
+
+ {
+ UniformBuffer& uniformBuffer = descriptorSetRenderer->GetUniformBuffer("ubo");
+ uniformBuffer.Set("projection", glm::ortho(-aspect, aspect, -1.0f, 1.0f));
+ uniformBuffer.Set("view", glm::translate(glm::mat4(1), glm::vec3(0.1 * glm::sin(4 * time), 0.1 * glm::cos(4 * time), 0.0)));
+ uniformBuffer.Update();
+ }
}
}
\ No newline at end of file
diff --git a/CopiumEngine/src/copium/core/Application.h b/CopiumEngine/src/copium/core/Application.h
index 00deeea..be2f11c 100644
--- a/CopiumEngine/src/copium/core/Application.h
+++ b/CopiumEngine/src/copium/core/Application.h
@@ -22,19 +22,19 @@ namespace Copium
private:
std::unique_ptr vulkan;
std::unique_ptr instance;
+ std::unique_ptr renderer;
std::unique_ptr framebuffer;
std::unique_ptr texture2D;
std::unique_ptr texture2D2;
- std::unique_ptr shaderUniformBuffer;
std::unique_ptr descriptorPool;
std::unique_ptr descriptorSet;
std::unique_ptr descriptorSetPassthrough;
+ std::unique_ptr descriptorSetRenderer;
std::unique_ptr graphicsPipeline;
std::unique_ptr graphicsPipelinePassthrough;
std::unique_ptr mesh;
std::unique_ptr meshPassthrough;
std::unique_ptr commandBuffer;
- std::unique_ptr renderer;
public:
Application();
@@ -44,13 +44,12 @@ namespace Copium
private:
void InitializeVulkan();
void InitializeFrameBuffer();
+ void InitializeRenderer();
void InitializeTextureSampler();
- void InitializeUniformBuffer();
void InitializeDescriptorSets();
void InitializeGraphicsPipeline();
void InitializeMesh();
void InitializeCommandBuffer();
- void InitializeRenderer();
void RecordCommandBuffer();
void UpdateUniformBuffer();
diff --git a/CopiumEngine/src/copium/pipeline/DescriptorSet.cpp b/CopiumEngine/src/copium/pipeline/DescriptorSet.cpp
index 41ce86d..221166d 100644
--- a/CopiumEngine/src/copium/pipeline/DescriptorSet.cpp
+++ b/CopiumEngine/src/copium/pipeline/DescriptorSet.cpp
@@ -5,10 +5,22 @@
namespace Copium
{
- DescriptorSet::DescriptorSet(Vulkan& vulkan, DescriptorPool& descriptorPool, VkDescriptorSetLayout descriptorSetLayout)
- : vulkan{vulkan}, descriptorPool{descriptorPool}, descriptorSetLayout{descriptorSetLayout}
+ DescriptorSet::DescriptorSet(Vulkan& vulkan, DescriptorPool& descriptorPool, VkDescriptorSetLayout descriptorSetLayout, const std::set& bindings)
+ : vulkan{vulkan}, descriptorPool{descriptorPool}, descriptorSetLayout{descriptorSetLayout}, bindings{bindings}
{
+ CP_ASSERT(!bindings.empty(), "DescriptorSet : cannot initialize DescriptorSet with empty ShaderBindings");
+
descriptorSets = descriptorPool.AllocateDescriptorSets(descriptorSetLayout);
+ for (auto& binding : bindings)
+ {
+ if (binding.bindingType == BindingType::UniformBuffer)
+ {
+ std::unique_ptr uniformBuffer = std::make_unique(vulkan, binding);
+ SetUniformBuffer(*uniformBuffer, binding.binding);
+ uniformBuffers.emplace(binding.name, std::move(uniformBuffer));
+ }
+ }
+ // TODO: Set default samplers and uniforms?
}
DescriptorSet::~DescriptorSet()
@@ -39,17 +51,27 @@ namespace Copium
{
for (size_t i = 0; i < descriptorSets.size(); ++i)
{
- SetSampler(sampler, binding, i, arrayIndex);
+ VkDescriptorImageInfo imageInfo = sampler.GetDescriptorImageInfo(i);
+ VkWriteDescriptorSet descriptorWrite{};
+ descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptorWrite.dstSet = descriptorSets[i];
+ descriptorWrite.dstBinding = binding;
+ descriptorWrite.dstArrayElement = arrayIndex;
+ descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptorWrite.descriptorCount = 1;
+ descriptorWrite.pBufferInfo = nullptr;
+ descriptorWrite.pImageInfo = &imageInfo;
+ descriptorWrite.pTexelBufferView = nullptr;
+ vkUpdateDescriptorSets(vulkan.GetDevice(), 1, &descriptorWrite, 0, nullptr);
}
}
- void DescriptorSet::SetSampler(const Sampler& sampler, uint32_t binding, int index, int arrayIndex)
+ void DescriptorSet::SetSamplerDynamic(const Sampler& sampler, uint32_t binding, int arrayIndex)
{
- CP_ASSERT(index >= 0 && index < descriptorSets.size(), "AddSampler : index is out of range");
- VkDescriptorImageInfo imageInfo = sampler.GetDescriptorImageInfo(index);
+ VkDescriptorImageInfo imageInfo = sampler.GetDescriptorImageInfo(vulkan.GetSwapChain().GetFlightIndex());
VkWriteDescriptorSet descriptorWrite{};
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptorWrite.dstSet = descriptorSets[index];
+ descriptorWrite.dstSet = descriptorSets[vulkan.GetSwapChain().GetFlightIndex()];
descriptorWrite.dstBinding = binding;
descriptorWrite.dstArrayElement = arrayIndex;
descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
@@ -81,6 +103,18 @@ namespace Copium
}
}
+ UniformBuffer& DescriptorSet::GetUniformBuffer(const std::string& uniformBuffer)
+ {
+ auto it = uniformBuffers.find(uniformBuffer);
+ CP_ASSERT(it != uniformBuffers.end(), "GetUniformBuffer : UniformBuffer not found = %s", uniformBuffer.c_str());
+ return *it->second;
+ }
+
+ uint32_t DescriptorSet::GetSetIndex() const
+ {
+ return bindings.begin()->set;
+ }
+
DescriptorSet::operator VkDescriptorSet() const
{
return descriptorSets[vulkan.GetSwapChain().GetFlightIndex()];
diff --git a/CopiumEngine/src/copium/pipeline/DescriptorSet.h b/CopiumEngine/src/copium/pipeline/DescriptorSet.h
index 4f405ac..ad0158d 100644
--- a/CopiumEngine/src/copium/pipeline/DescriptorSet.h
+++ b/CopiumEngine/src/copium/pipeline/DescriptorSet.h
@@ -2,11 +2,18 @@
#include "copium/buffer/UniformBuffer.h"
#include "copium/pipeline/DescriptorPool.h"
+#include "copium/pipeline/ShaderBinding.h"
+#include "copium/pipeline/ShaderReflector.h"
#include "copium/sampler/Sampler.h"
#include "copium/util/Common.h"
+#include
#include
+#include