summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-20 15:10:30 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-20 15:10:30 -0400
commit37dd0adf200d21924d69fd3ee7f084916087ac1c (patch)
tree323e14eda2d757d65355ef3139abd399869b99d4
parent3a5ac5ce7a039a07f775aab6e37a423ddf9294ed (diff)
present fragment shader references sampler
-rw-r--r--assets/shaders/present.frag8
-rw-r--r--src/window.cpp60
-rw-r--r--src/window.hpp1
3 files changed, 47 insertions, 22 deletions
diff --git a/assets/shaders/present.frag b/assets/shaders/present.frag
index 427468c..2a95989 100644
--- a/assets/shaders/present.frag
+++ b/assets/shaders/present.frag
@@ -1,10 +1,16 @@
#version 450
+layout (binding = 0) uniform sampler2D samplerColor;
+
layout (location = 0) in vec2 inUV;
layout (location = 0) out vec4 outFragColor;
void main()
{
- outFragColor = vec4(0, 0, 0, 1);
+ vec4 color = texture(samplerColor, inUV);
+ if (color.w == 0) {
+ discard;
+ }
+ outFragColor = color;
}
diff --git a/src/window.cpp b/src/window.cpp
index 406ccc5..b32ea15 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -71,6 +71,11 @@ VkCommandBuffer presentCommandBuffers[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentImageAvailableSemaphores[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentRenderFinishedSemaphores[MAX_FRAMES_IN_FLIGHT];
VkFence presentInFlightFences[MAX_FRAMES_IN_FLIGHT];
+UniformBufferObject UBO{
+ .model = glm::mat4(1),
+ .view = glm::mat4(1),
+ .proj = glm::mat4(1),
+};
VkDeviceMemory uniformBufferMemory;
VkBuffer uniformBuffers[MAX_FRAMES_IN_FLIGHT];
@@ -697,6 +702,29 @@ void CreateSwapchain() {
CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, depthImages, depthImageViews, &depthImagesMemory);
}
+void UpdatePresentDescriptorSets() {
+ VkWriteDescriptorSet writeDescriptorSets[MAX_FRAMES_IN_FLIGHT];
+ VkDescriptorImageInfo descriptorImageInfo[MAX_FRAMES_IN_FLIGHT];
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ writeDescriptorSets[i].pNext = nullptr;
+ writeDescriptorSets[i].dstBinding = 0U;
+ writeDescriptorSets[i].dstArrayElement = 0U;
+ writeDescriptorSets[i].descriptorCount = 1;
+ writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ writeDescriptorSets[i].pBufferInfo = nullptr;
+ writeDescriptorSets[i].pTexelBufferView = nullptr;
+ descriptorImageInfo[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ descriptorImageInfo[i].sampler = presentSampler;
+
+ descriptorImageInfo[i].imageView = renderImageViews[i];
+ writeDescriptorSets[i].pImageInfo = &descriptorImageInfo[i];
+ writeDescriptorSets[i].dstSet = presentDescriptorSets[i];
+ }
+
+ vkUpdateDescriptorSets(vkDevice, MAX_FRAMES_IN_FLIGHT, writeDescriptorSets, 0, nullptr);
+}
+
void CreateRenderPass() {
VkAttachmentDescription colorAttachment;
colorAttachment.flags = {};
@@ -1030,27 +1058,6 @@ void CreateGraphicsPipeline() {
throw "failed to create graphics pipeline.";
}
- VkWriteDescriptorSet writeDescriptorSets[MAX_FRAMES_IN_FLIGHT];
- VkDescriptorImageInfo descriptorImageInfo[MAX_FRAMES_IN_FLIGHT];
- for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
- writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- writeDescriptorSets[i].pNext = nullptr;
- writeDescriptorSets[i].dstBinding = 0U;
- writeDescriptorSets[i].dstArrayElement = 0U;
- writeDescriptorSets[i].descriptorCount = 1;
- writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- writeDescriptorSets[i].pBufferInfo = nullptr;
- writeDescriptorSets[i].pTexelBufferView = nullptr;
- descriptorImageInfo[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- descriptorImageInfo[i].sampler = presentSampler;
-
- descriptorImageInfo[i].imageView = renderImageViews[i];
- writeDescriptorSets[i].pImageInfo = &descriptorImageInfo[i];
- writeDescriptorSets[i].dstSet = presentDescriptorSets[i];
- }
-
- vkUpdateDescriptorSets(vkDevice, MAX_FRAMES_IN_FLIGHT, writeDescriptorSets, 0, nullptr);
-
vkDestroyShaderModule(vkDevice, fragShader, vkAllocator);
vkDestroyShaderModule(vkDevice, vertShader, vkAllocator);
AM_Destroy(fragShaderAsset);
@@ -1364,6 +1371,7 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
renderPassInfo.clearValueCount = 1;
vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
+ vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &presentDescriptorSets[imageIndex], 0, nullptr);
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
@@ -1457,6 +1465,7 @@ void RecreateSwapchain() {
vkDeviceWaitIdle(vkDevice);
DestroySwapchain();
CreateSwapchain();
+ UpdatePresentDescriptorSets();
CreateFramebuffers();
shouldRecreateSwapchain = false;
}
@@ -1478,6 +1487,7 @@ void CreateWindow(PKEWindowProperties *wp) {
CreateSwapchain();
CreateRenderPass();
CreateGraphicsPipeline();
+ UpdatePresentDescriptorSets();
CreateFramebuffers();
CreateCommandPool();
CreateCommandBuffer();
@@ -1551,6 +1561,14 @@ void Render() {
throw "failed to acquire swapchain";
}
+ // update uniform buffer
+ {
+ void *mappedUboMemory;
+ vkMapMemory(vkDevice, uniformBufferMemory, sizeof(UniformBufferObject) * imageIndex, sizeof(UniformBufferObject), 0, &mappedUboMemory);
+ memcpy(mappedUboMemory, &UBO, sizeof(UniformBufferObject));
+ vkUnmapMemory(vkDevice, uniformBufferMemory);
+ }
+
vkResetFences(vkDevice, 1, &presentInFlightFences[CURRENT_FRAME]);
vkResetCommandBuffer(presentCommandBuffers[CURRENT_FRAME], 0);
diff --git a/src/window.hpp b/src/window.hpp
index a307671..1ca4dc8 100644
--- a/src/window.hpp
+++ b/src/window.hpp
@@ -51,6 +51,7 @@ struct UniformBufferObject {
glm::mat4 view;
glm::mat4 proj;
};
+extern UniformBufferObject UBO;
void CreateWindow(PKEWindowProperties *wp);
void DestroyWindow();