Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 450
- #extension GL_ARB_separate_shader_objects: enable
- layout (local_size_x = 16, local_size_y = 16) in;
- layout (binding = 0, rgba8) uniform image2D resultImage;
- void main(){
- imageStore(resultImage, ivec2(gl_GlobalInvocationID.xy), vec4(1, 1, 0, 1));
- }
- namespace dynamic {
- namespace INTERNAL {
- void Raytracer::init()
- {
- m_raytraceShader = std::make_unique<RaytraceShader>();
- }
- Image Raytracer::execute()
- {
- vulkan::VulkanDevice& device = vulkan::vulkanManager.getDevice();
- vulkan::VulkanImage vulkanImage = m_raytraceShader->execute();
- vulkan::VulkanImageView imgView;
- vulkan::VulkanImageSampler imgSampler;
- imgView.init(vulkanImage.getImage(), VK_FORMAT_R8G8B8A8_UNORM, device);
- imgSampler.init(device);
- Image image(vulkanImage, imgSampler, imgView, graphicsManager.getWidth(), graphicsManager.getHeight());
- return image;
- }
- void Raytracer::initCommandBuffer()
- {
- m_raytraceShader->initCommandBuffer(m_pipeline);
- }
- void Raytracer::initPipeline()
- {
- m_pipeline.init(*m_raytraceShader, m_raytraceShader->getDescriptorSet());
- }
- void Raytracer::destroy()
- {
- m_pipeline.destroy();
- m_raytraceShader->destroy();
- }
- RaytraceShader::RaytraceShader()
- : VulkanShader({ "comp.spv" }, { VK_SHADER_STAGE_COMPUTE_BIT }, vulkan::NO_REGISTRATION),
- m_imageDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
- {
- m_descriptorSet.addDescriptor(m_imageDescriptor);
- m_storageImage.init(graphicsManager.getWidth(), graphicsManager.getHeight(), VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_LAYOUT_GENERAL);
- m_storageImageView.init(m_storageImage.getImage(), VK_FORMAT_R8G8B8A8_UNORM, vulkan::vulkanManager.getDevice());
- }
- void RaytraceShader::updateDescriptors()
- {
- m_descriptorSet.updateDescriptor(m_imageDescriptor, m_storageImage, m_storageImageView);
- }
- vulkan::VulkanImage RaytraceShader::execute()
- {
- m_cmdBuffer.execute();
- return m_storageImage;
- }
- void RaytraceShader::initCommandBuffer(const vulkan::VulkanComputePipeline& pipeline)
- {
- vulkan::VulkanCommandBuffer commandBuffer(vulkan::vulkanManager.getDevice().getComputeQueueIndex());
- commandBuffer.startCmdBuffer(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
- vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
- VkDescriptorSet set = m_descriptorSet.getDescriptorSet();
- vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.getPipelineLayout(), 0, 1, &set, 0, nullptr);
- vkCmdDispatch(commandBuffer, graphicsManager.getWidth() / 16, graphicsManager.getHeight() / 16, 0);
- commandBuffer.endCmdBuffer();
- m_cmdBuffer = commandBuffer;
- }
- void RaytraceShader::destroy()
- {
- m_storageImageView.destroy();
- }
- }
- }
- m_raytracer.init();
- INTERNAL::FullscreenTextureRenderer::initShader();
- m_raytracer.initPipeline();
- m_raytracer.getShader()->updateDescriptors();
- m_raytracer.initCommandBuffer();
- m_image = m_raytracer.execute();
- INTERNAL::FullscreenTextureRenderer::loadImage(m_image);
Add Comment
Please, Sign In to add comment