<aside> 💡 Vulkan Tutorial 영어 원문
</aside>
이제 이전 장의 모든 구조와 개체를 합쳐서 그래픽 파이프라인을 만들 수 있습니다! 간략히 요약하면 다음과 같은 객체 유형이 있습니다:
이것들이 결합하여 그래픽 파이프라인의 기능을 정의하므로, 이제 createGraphicsPipeline의 끝에 VkGraphicsPipelineCreateInfo 구조를 채울 수 있습니다. 하지만 이것들을 생성하는 동안에도 계속 사용해야 하기 때문에 vkDestroyShaderModule 을 호출하기 전이여야 합니다.
VkGraphicsPipelineCreateInfo pipelineInfo{};
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;
VkPipelineShaderStageCreateInfo 구조체 배열을 참조하는 것으로 시작합니다.
pipelineInfo.pVertexInputState = &vertexInputInfo;
pipelineInfo.pInputAssemblyState = &inputAssembly;
pipelineInfo.pViewportState = &viewportState;
pipelineInfo.pRasterizationState = &rasterizer;
pipelineInfo.pMultisampleState = &multisampling;
pipelineInfo.pDepthStencilState = nullptr; // Optional
pipelineInfo.pColorBlendState = &colorBlending;
pipelineInfo.pDynamicState = &dynamicState;
그 다음 고정 기능 단계를 설명하는 모든 구조를 참조합니다.
pipelineInfo.layout = pipelineLayout;
그 다음에는 구조체 포인터가 아닌 Vulkan 핸들인 파이프라인 레이아웃이 나옵니다.
pipelineInfo.renderPass = renderPass;
pipelineInfo.subpass = 0;
마지막으로 렌더패스에 대한 참조와 그래픽 파이프라인이 사용할 서브패스의 인덱스가 있습니다. 이 특정 인스턴스 대신 이 파이프라인과 함께 다른 렌더패스를 사용할 수도 있지만, rederPass와 호환되어야 합니다. 호환성 요구사항은 여기에 설명되어 있지만 이 튜토리얼에선 해당 기능을 사용하지 않습니다.
pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional
pipelineInfo.basePipelineIndex = -1; // Optional
실제로 두개의 매개변수가 더 있습니다: basePipelineHandle과 basePipelineIndex. Vulkan은 기존 파이프라인에서 파생하여 새로운 그래픽 파이프라인을 만들 수 있습니다. 파이프라인 파생 아이디어는 기존 파이프라인과 많은 기능을 공유하고 동일한 상위 파이프라인 간의 전환도 더 빠르게 수행할 수 있다면 파이프라인을 구성하는 비용이 더 적다는 것입니다. basePipelineHandler에 기존 파이프라인 핸들을 지정하거나, basePipelineIndex에 인덱스에 의해 생성될 다른 파이프라인을 참조할 수 있습니다. 지금은 단일 파이프라인만 있으므로 핸들에 null을 지정하고 적합하지 않은 인덱스를 지정하겠습니다. 이 값들은 VkGraphicsPipelineCreateInfo의 flag 값이 VK_PIPELINE_CREATE_DERIVATIVE_BIT 으로 지정된 경우에만 사용됩니다.
이제 VkPipeline 객체를 담을 클래스 멤버를 생성하여 마지막 단계를 준비합니다:
VkPipeline graphicsPipeline;
마지막으로 그래픽 파이프라인을 만듭니다: