본문 바로가기

Vulkan

Graphics pipeline basics- Conclusion

이전 글 : Graphics Pipeline basics - Render passes

다음 글 : Drawing - Framebuffers



Graphics pipeline basics- Conclusion
정리

이전 장의 모든 구조와 객체를 결합하여 그래픽 파이프 라인을 만들 수 있습니다! 다음은 우리가 지금 가지고 있는 객체의 유형입니다.


  • 쉐이더 스테이지 : 그래픽 파이프 라인의 프로그래머블 스테이지 기능을 정의하는 쉐이더 모듈

  • 고정 기능 상태 : 입력 어셈블리, 래스터 라이저, 뷰포트 및 색상 혼합과 같이 파이프 라인의 고정 함수 단계를 정의하는 모든 구조

  • 파이프 라인 레이아웃 : 그리기 시간에 업데이트 할 수 있는 셰이더에서 참조하는 유니폼 및 푸시 값

  • 렌더링 패스 : 파이프 라인 단계에서 참조하는 어태치먼트 및 사용법


이 모든 것을 결합하여 그래픽 파이프 라인의 기능을 완전히 정의하므로 이제 createGraphicsPipeline 함수의 끝에 VkGraphicsPipelineCreateInfo 구조를 채울 수 있습니다.


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 = nullptr; // Optional


그런 다음 고정 기능 단계를 설명하는 모든 구조를 참조합니다.


pipelineInfo.layout = pipelineLayout;


그 다음에는 구조체 포인터가 아닌 Vulkan 핸들인 파이프 라인 레이아웃이 나옵니다.


pipelineInfo.renderPass = renderPass;
pipelineInfo.subpass = 0;


마지막으로 렌더링 패스와 이 그래픽 파이프 라인이 사용될 하위 패스의 인덱스에 대한 참조가 있습니다. 이 특정 인스턴스 대신 이 파이프 라인에서 다른 렌더링 패스를 사용할 수도 있지만 renderPass와 호환 가능해야 합니다. 호환성 요구 사항은 여기에 설명되어 있지만 이 튜토리얼에서는 이 기능을 사용하지 않을 것입니다.


pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional
pipelineInfo.basePipelineIndex = -1; // Optional


실제로 두 개의 매개 변수가 더 있습니다. basePipelineHandle과 basePipelineIndex 입니다. Vulkan을 사용하면 기존 파이프 라인에서 파생하여 새로운 그래픽 파이프 라인을 만들 수 있습니다. 파이프 라인 파생물에 대한 아이디어는 기존 파이프 라인과 공통된 기능을 많이 갖추고 파이프 라인을 설정하는 데 드는 비용이 저렴하고 동일한 부모의 파이프 라인 간 전환도 더 빨리 수행 될 수 있다는 것입니다. basePipelineHandle로 기존 파이프 라인의 핸들을 지정하거나 basePipelineIndex로 인덱스로 만들려는 다른 파이프 라인을 참조 할 수 있습니다. 현재는 파이프 라인이 하나뿐이므로 null 핸들과  인덱스 -1 을 지정하기 만하면 됩니다. 이 값은 Vk_PIPELINE_CREATE_DERIVATIVE_BIT 플래그가 VkGraphicsPipelineCreateInfo 의 플래그 필드에도 지정된 경우에만 사용됩니다.


이제 VkPipeline 객체를 보유 할 클래스 멤버를 만들어 마지막 단계를 준비하십시오.

VkPipeline graphicsPipeline;


그리고 마지막으로 그래픽 파이프 라인을 만듭니다.


if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {
   throw std::runtime_error("failed to create graphics pipeline!");
}



vkCreateGraphicsPipelines 함수는 실제로 Vulkan의 일반적인 객체 생성 함수보다 많은 매개 변수를 가집니다. 여러 개의 VkGraphicsPipelineCreateInfo 개체를 가져 와서 한 번의 호출로 여러 개의 VkPipeline 개체를 만들 수 있습니다.


VK_NULL_HANDLE 인수를 전달한 두 번째 매개 변수는 선택적 VkPipelineCache 개체를 참조합니다. 파이프 라인 캐시는 vkCreateGraphicsPipeline 에 대한 여러 호출에서 파이프 라인 생성과 관련된 데이터를 저장하고 재사용하는 데 사용할 수 있으며 캐시가 파일에 저장되는 경우 프로그램 실행 전체에서 사용할 수도 있습니다. 따라서 나중에 파이프 라인 생성 속도를 크게 높일 수 있습니다. 우리는 파이프 라인 캐시 (pipeline cache) 장에서이 문제에 관해 논의 할 것입니다.


그래픽 파이프 라인은 모든 일반적인 그리기 작업에 필요하므로 프로그램이 끝날 때만 파기해야 합니다.


void cleanup() {
   vkDestroyPipeline(device, graphicsPipeline, nullptr);
   vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
   ...
}


이제이 모든 노력이 파이프 라인 생성을 성공적으로 수행했음을 확인하기 위해 프로그램을 실행하십시오! 우리는 이제 화면에 목표로 하는 삼각형이 표시되는 것에 아주 가까워지고 있습니다. 다음 장에서는 스왑 체인 이미지에서 실제 프레임 버퍼를 설정하고 드로잉 명령을 준비할 것 입니다.


C++ code / Vertex shader / Fragment shader


이전 글 : Graphics Pipeline basics - Render passes

다음 글 : Drawing - Framebuffers



'Vulkan' 카테고리의 다른 글

Drawing - Command buffers  (1) 2018.01.25
Drawing - Framebuffers  (1) 2018.01.24
Graphics Pipeline basics - Render passes  (0) 2018.01.24
Graphics Pipeline basics - Fixed function  (0) 2018.01.24
Graphics Pipeline basics - Shader modules  (0) 2018.01.24