Constructor Function. Create VkPipeline.
Receive PipelineLayout from parameter.
Instance VkPipelineShaderStageCreateInfo.
Raygen.
Miss.
Closest hit.
Instance a VkGraphicsPipelineCreateInfo.
Create Pipeline.
Receive PipelineLayout from parameter.
Instance VkPipelineShaderStageCreateInfo.
Raygen.
Miss.
Closest hit.
Instance a VkGraphicsPipelineCreateInfo.
Create Pipeline.
222 {
224
229
233 std::vector<std::shared_ptr<VulkanShaderModule>> shaderModules;
234 for (auto& pair : shaders)
235 {
236 for(size_t i = 0; i < pair.second.size(); i++)
237 {
238 std::stringstream ss;
239 ss << pair.first << "." << pair.second[i];
240
241 shaderModules.push_back(ResourcePool<Shader>::Load<Shader>(ss.str(), pair.second[i], pair.first)->GetShaderModule());
242 }
243 }
244
248 std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
249 for (size_t i = 0; i < shaderModules.size(); i++)
250 {
251 shaderStages.push_back(shaderModules[i]->GetShaderStageCreateInfo());
252 }
253
257 VkRayTracingShaderGroupCreateInfoKHR group{};
258 group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
259 group.anyHitShader = VK_SHADER_UNUSED_KHR;
260 group.closestHitShader = VK_SHADER_UNUSED_KHR;
261 group.generalShader = VK_SHADER_UNUSED_KHR;
262 group.intersectionShader = VK_SHADER_UNUSED_KHR;
263
264 std::vector<VkRayTracingShaderGroupCreateInfoKHR> m_RTShaderGroups;
265
266 for (auto& pair : shaders)
267 {
271 if(pair.first == "rgen")
272 {
273 for(size_t i = 0; i < pair.second.size(); i++)
274 {
275 group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
276 group.generalShader = static_cast<uint32_t>(m_RTShaderGroups.size());
277
278 m_RTShaderGroups.push_back(group);
279 }
280 }
281
285 else if(pair.first == "rmiss")
286 {
287 for(size_t i = 0; i < pair.second.size(); i++)
288 {
289 group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
290 group.generalShader = static_cast<uint32_t>(m_RTShaderGroups.size());
291
292 m_RTShaderGroups.push_back(group);
293 }
294 }
295
299 else if(pair.first == "rchit")
300 {
301 for(size_t i = 0; i < pair.second.size(); i++)
302 {
303 group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR;
304 group.generalShader = VK_SHADER_UNUSED_KHR;
305 group.closestHitShader = static_cast<uint32_t>(m_RTShaderGroups.size());
306
307 m_RTShaderGroups.push_back(group);
308 }
309 }
310 else
311 {
312 SPICES_CORE_ERROR("RayTracing Pipeline: Not Supported Sahder Stage from material.");
313 }
314 }
315
319 VkRayTracingPipelineCreateInfoKHR rayPipelineInfo{};
320 rayPipelineInfo.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
321 rayPipelineInfo.stageCount = static_cast<uint32_t>(shaderStages.size());
322 rayPipelineInfo.pStages = shaderStages.data();
323 rayPipelineInfo.groupCount = static_cast<uint32_t>(m_RTShaderGroups.size());
324 rayPipelineInfo.pGroups = m_RTShaderGroups.data();
325 rayPipelineInfo.maxPipelineRayRecursionDepth = 2;
327
333 }
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
VulkanPipeline(VulkanState &vulkanState)
Constructor Function.
VkPipeline m_Pipeline
The VkPipeline.
VkPipelineLayout m_PipelineLayout
The VkPipelineLayout.