Vulkan Tutorial (12) - Draw a triangle - Graphics Pipeline Basic - Validation Layers
다음 몇 챕터동안 우리는 첫번째 삼각형을 그리도록 구성된 그래픽 파이프라인을 세팅할 것입니다. 그래픽 파이프라인은 메쉬의 정점과 텍스쳐들을 렌더타겟의 픽셀까지 가져오는 일련의 작업들입니다. 간략한 개요가 아래에 나와있습니다:
입력 어셈블러(Input assembler)는 당신이 지정한 버퍼에서 원시 정점 데이터를 수집합니다. 그리고 정점 데이터를 복사할 필요 없이 인덱스 버퍼를 사용하여 특정 요소를 반복하여 작업할 수 있습니다.
정점 셰이더(vertex shader)는 모든 정점에 대해 실행됩니다. 일반적으로 모델 공간(model space)에서 화면 공간(screen space)로 정점 위치를 바꾸기 위해 변환을 적용합니다. 또한 정점별 데이터를 다음 파이프라인으로 전달합니다.
테셀레이션 셰이더(tessellation shader)는 지오메트리를 특정 규칙에 따라 작게 나누어 메시의 품질을 높일 수 있습니다. 종종 벽돌 벽과 계단같이 가까이에서 보았을 때, 덜 평평하게 보이도록 하는 작업들에 사용됩니다.
기하학 셰이더(geometry shader)는 모든 프리미티브(primitive - 삼각형, 선, 점)에서 실행되며, 들어온 프리미티브를 버리거나, 보다 더 많은 프리미티브를 출력할 수 있습니다. 이건 테셀레이션 셰이더와 유사하지만 훨씬 더 유연합니다. 그러나 Intel의 통합 GPU를 제외한 대부분의 그래픽 카드에서 성능이 좋지 않기 때문에, 최근 어플리케이션들에서는 많이 사용되지 않습니다.
래스터화(rasterization) 단계는 프리미티브를 조각(fragment)로 이산화합니다. 이들은 프레임버퍼를 채우는 픽셀 요소들입니다. 화면 밖에 있는 조각들은 폐기되고, 정점 셰이더에서 출력된 속성들은 그림에서 보이는 것과 같이 조각 전반에 걸쳐 보간됩니다. 보통 다른 프리미티브 조각의 뒤에 가려진 조각들도 깊이 테스트로 인해 이 단계에서 제거됩니다.
조각 셰이더(fragment shader)는 살아남은 모든 조각들에 대해 호출되며, 조각들이 기록되는 프레임버퍼와 색상, 깊이 값을 결정합니다. 정점 셰이더에서 보간된 데이터를 이용해서, 법선(normal)이나 조명(lighting)과 같은 것들을 수행할 수 있습니다.
색상 혼합(color blending) 단계는 프레임버퍼의 같은 픽셀에 매핑되는 여러 조각들을 혼합하는 작업을 적용합니다. 조각들은 단순히 서로 덮어쓰거나, 투명도에 따라 더해지거나 혼합될 수 있습니다.
녹색으로 된 단계는 고정 기능 단계라고 합니다. 이 단계들은 매개변수를 이용하여 조정할 수 있지만, 작동 방식은 이미 정의되어 있습니다.
주황색으로 된 단계는 프로그래밍 가능한(programmable) 단계이며, 당신의 코드를 그래픽 카드에 업로드하여 원하는 작업을 정확하게 적용할 수 있음을 의미합니다. 예를 들어, 조각 셰이더를 사용할 때, 텍스쳐링과 조명에서 레이 트레이서에 이르기까지 모든 것을 구현할 수 있습니다. 이러한 프로그램은 다수의 GPU 코어에서 동시에 실행되어, 정점과 조각 같은 다수의 오브젝트를 병렬로 처리합니다.
이전에 OpenGL이나 Direct3D같은 API들을 사용한 적이 있다면, glBlendFunc과 OMSetBlendState같이 임의의 파이프라인 설정을 바꿀 수 있는 것에 익숙할 것입니다. Vulkan의 그래픽 파이프라인은 거의 변경이 불가능하므로, 셰이더를 바꾸거나 다른 프레임버퍼를 바인딩하거나 블렌드 기능을 변경하려면, 파이프라인을 새로 만들어야 합니다. 단점은 렌더링 작업에 사용되는 다양한 상태의 조합 수만큼 파이프라인을 생성해야 한다는 것입니다. 하지만, 파이프라인에서 수행될 작업을 모두 알고 있기 때문에 드라이버가 더 잘 최적화할 수 있습니다.
프로그래밍 가능한 단계 중 일부는 하고자 하는 작업에 따라 선택 사항입니다. 예를 들어, 단순한 지오메트리를 그릴 때에는 테셀레이션과 지오메트리 단계는 비활성화할 수 있습니다. 당신이 깊이 값에만 관심이 있다면, 그림자 맵(shadow map) 생성에 유용한 조각 셰이더 단계를 비활성화 할 수 있습니다.
다음 챕터에서는 삼각형을 화면에 표시하기 위해 필요한 두개의 프로그래밍 가능한 단계를 만들 것입니다: 정점 셰이더와 조각 셰이더입니다. 혼합 모드, 뷰포트, 래스터화 같은 고정 기능 구성은 그 다음 챕터에서 다룹니다. Vulkan의 그래픽 파이프라인 설정 마지막 부분에는 입력과 출력 프레임버퍼 사양이 포함됩니다.
createGraphicsPipeline 함수를 만들고 initVulkan의 createImageViews 바로 아래에서 호출해줍니다. 다음 장에서 이 기능을 다룰 것입니다.
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createGraphicsPipeline();
}
...
void createGraphicsPipeline() {
}