diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-20 15:10:30 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-20 15:10:30 -0400 |
| commit | 37dd0adf200d21924d69fd3ee7f084916087ac1c (patch) | |
| tree | 323e14eda2d757d65355ef3139abd399869b99d4 | |
| parent | 3a5ac5ce7a039a07f775aab6e37a423ddf9294ed (diff) | |
present fragment shader references sampler
| -rw-r--r-- | assets/shaders/present.frag | 8 | ||||
| -rw-r--r-- | src/window.cpp | 60 | ||||
| -rw-r--r-- | src/window.hpp | 1 |
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(); |
