<aside> 💡 Vulkan Tutorial 영어 원문
</aside>
이전 그래픽 API들은 대부분 그래픽 파이프라인 단계에 대해 기본 상태를 제공했습니다. Vulkan에서는 바뀌지 않는 파이프라인 상태 오브젝트로 구워질 것이기 때문에 대부분의 파이프라인에 대해 명시적이어야 합니다. 이 챕터에서는 이러한 고정 기능 연산을 구성하기 위한 구조를 채울 것입니다.
대부분의 파이프라인 상태가 구워지는 동안, 그리기 시간에 파이프라인을 다시 만들지 않고도 상태의 제한량이 변경될 수 있습니다. 예로 뷰포트의 크기, 선 너비와 블렌드 상수가 있습니다. 동적 상태를 사용하고 이러한 속성들을 유지하려면, VkPipelineDynamicStateCreateInfo에 다음과 같은 구조를 채워야 합니다:
std::vector<VkDynamicState> dynamicStates = {
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR
};
VkPipelineDynamicStateCreateInfo dynamicState{};
dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
dynamicState.dynamicStateCount = static_cast<uint32_t>(dynamicStates.size());
dynamicState.pDynamicStates = dynamicStates.data();
이렇게 하면 값의 구성이 무시되고, 당신은 그리기 시간에 데이터를 지정할 수 있습니다. 유연한 설정의 결과는 뷰포트나 자르기 상태같이 매우 일반적인 것들을 파이프라인 상태로 구울 때 설정이 더 복잡해지는 것입니다.
VkPipelineVertexInputStateCreateInfo 구조체는 정점 셰이터에 전달될 정점 데이터의 형식을 설명합니다. 대략 두가지 방법으로 설명합니다:
정점 셰이더에서 정점 데이터를 직접 작성하는 것은 어렵기 때문에, 지금은 정점 데이터를 로드하지 않도록 구조체를 채울 것입니다. 정점 버퍼 챕터에서 다시 다룰 것입니다.
VkPipelineVertexInputStateCreateInfo vertexInputInfo{};
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
vertexInputInfo.vertexBindingDescriptionCount = 0;
vertexInputInfo.pVertexBindingDescriptions = nullptr; // Optional
vertexInputInfo.vertexAttributeDescriptionCount = 0;
vertexInputInfo.pVertexAttributeDescriptions = nullptr; // Optional
pVertexBinidngDescriptions와 pVertexAttributeDescriptions 멤버는 정점 데이터를 불러오기 위해 앞서 말한 세부 사항들을 설명하기 위한 구조체 배열을 가리킵니다. 이 구조체를 createGraphicsPipeline 함수의 shaderStages 배열 바로 뒤에 추가하세요.
VkPipelineInputAsemblyStateCreateInfo 구조체는 두가지를 설명합니다: 정점들을 어떤 종류의 지오메트리로 그릴 것인지, 그리고 프리미티브 재시작이 활성화되어야 하는지입니다. 전자는 topology 멤버에서 지정되며 다음과 같은 값을 가질 수 있습니다:
VK_PRIMITIVE_TOPOLOGY_POINT_LIST: 정점.VK_PRIMITIVE_TOPOLOGY_LINE_LIST: 재사용 없이 2개 정점의 선.VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: 모든 선의 마지막 정점이 시작 정점을 다음 선의 시작 정점으로 사용됨.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: 재사용 없이 3개 정점의 삼각형.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: 모든 삼각형의 두번째와 세번째 정점이 다음 삼각형의 첫번째와 두번째 정점으로 사용됨.