skybox_system.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "skybox_system.h"
  2. #include "vk_initializers.h"
  3. namespace coral_3d
  4. {
  5. skybox_system::skybox_system(coral_device& device, VkRenderPass render_pass, std::vector<VkDescriptorSetLayout>& desc_set_layouts)
  6. : device_{device}
  7. {
  8. create_pipeline_layout(device_, desc_set_layouts);
  9. create_pipeline(render_pass);
  10. }
  11. skybox_system::~skybox_system()
  12. {
  13. vkDestroyPipelineLayout(device_.device(), pipeline_layout_, nullptr);
  14. }
  15. void skybox_system::render(FrameInfo& frame_info)
  16. {
  17. pipeline_->bind(frame_info.command_buffer);
  18. vkCmdBindDescriptorSets(
  19. frame_info.command_buffer,
  20. VK_PIPELINE_BIND_POINT_GRAPHICS,
  21. pipeline_layout_,
  22. 0, 1,
  23. &frame_info.global_descriptor_set,
  24. 0, nullptr
  25. );
  26. for(auto& kv: frame_info.gameobjects)
  27. {
  28. auto &obj = kv.second;
  29. if (obj->point_light_ == nullptr) continue;
  30. vkCmdDraw(frame_info.command_buffer, 36, 1, 0, 0);
  31. }
  32. }
  33. void skybox_system::create_pipeline_layout(coral_device &device, std::vector<VkDescriptorSetLayout>& desc_set_layouts)
  34. {
  35. VkPipelineLayoutCreateInfo layout_info{ vkinit::pipeline_layout_ci() };
  36. layout_info.pushConstantRangeCount = 0;
  37. layout_info.pPushConstantRanges = nullptr;
  38. layout_info.setLayoutCount = static_cast<uint32_t>(desc_set_layouts.size());
  39. layout_info.pSetLayouts = desc_set_layouts.data();
  40. if (vkCreatePipelineLayout(device.device(), &layout_info, nullptr, &pipeline_layout_) != VK_SUCCESS)
  41. throw std::runtime_error("ERROR! skybox_system::create_pipeline_layout() >> Failed to create pipeline layout!");
  42. }
  43. void skybox_system::create_pipeline(VkRenderPass render_pass)
  44. {
  45. PipelineConfigInfo config_info{};
  46. coral_pipeline::default_pipeline_config_info(config_info);
  47. config_info.binding_descriptions.clear();
  48. config_info.attribute_descriptions.clear();
  49. config_info.depth_stencil_info.depthWriteEnable = VK_FALSE;
  50. config_info.depth_stencil_info.depthTestEnable = VK_FALSE;
  51. config_info.render_pass = render_pass;
  52. config_info.pipeline_layout = pipeline_layout_;
  53. pipeline_ = std::make_unique<coral_pipeline>(
  54. device_,
  55. "assets/shaders/skybox.vert.spv",
  56. "assets/shaders/skybox.frag.spv",
  57. config_info
  58. );
  59. }
  60. } // coral_3d