본문 바로가기

Vulkan

Graphics Pipeline basics - introduction

이전 글 : Image views
다음 글 : Shader modules



Graphics Pipeline basics

Introduction

다음 몇 강좌를 통해 우리는 첫 번째 삼각형을 그리도록 구성된 그래픽 파이프 라인을 설정할 것입니다. 그래픽 파이프 라인은 렌더링 타겟의 픽셀까지 메쉬의 꼭지점과 텍스처를 가져 오는 일련의 작업입니다. 간략한 개요가 아래에 표시됩니다.


입력 어셈블러는 지정한 버퍼에서 원시 버텍스 데이터를 수집하고 인덱스 버퍼를 사용하여 버텍스 데이터 자체를 복제하지 않고도 특정 요소를 반복 할 수 있도록 합니다.


버텍스 쉐이더는 모든 버텍스에 대해 실행되며, 일반적으로 버텍스 위치를 모델 공간에서 스크린 공간으로 변환하는 작업을 합니다. 또한 버텍스 별 데이터를 다음 파이프 라인 스테이지로 전달합니다.


테셀레이션 쉐이더를 사용하면 특정 규칙을 기반으로 형상을 세분화하여 메시 품질을 높일 수 있습니다. 이것은 종종 벽돌 벽이나 계단과 같은 표면을 근처에 있을 때 덜 평평하게 보이게 하는데 사용됩니다.


지오메트리 셰이더는 모든 프리미티브 (삼각형, 선, 점)에 대해 실행되어 버려 지거나 들어오는 것보다 많은 프리미티브를 출력 할 수 있습니다. 이것은 테셀레이션 셰이더와 비슷하지만 훨씬 더 융통성이 있습니다. 그러나 인텔의 통합 GPU를 제외하고는 대부분의 그래픽 카드에서 성능이 좋지 않기 때문에 오늘날의 응용 프로그램에서는 별로 사용되지 않습니다.


래스터 화 단계에서는 프리미티브가 조각으로 분리됩니다. 이들은 프레임 버퍼에 채우는 픽셀 요소입니다. 화면 외부에있는 모든 조각은 버려지고 그림에 표시된대로 꼭지점 셰이더가 출력 한 특성이 조각 전체에 보간됩니다. 일반적으로 다른 기본 조각 뒤에있는 조각도 깊이 테스트 때문에 여기에서 버려집니다.


프래그먼트 쉐이더는 존속하는 모든 프래그먼트에 대해 호출되며 프래그먼트가 어느 프레임 버퍼에 쓰여지고 어떤 색상 및 깊이 값으로 기록되는지 결정합니다. 버텍스 쉐이더의 보간 된 데이터를 사용하여 이를 수행 할 수 있습니다. 텍스처 좌표와 조명 법선과 같은 것들을 포함 할 수 있습니다.


색상 블렌딩 단계는 프레임 버퍼의 동일한 픽셀에 매핑되는 여러 조각을 혼합하는 작업을 적용합니다. 프래그먼트는 단순히 서로 겹쳐 쓰거나 투명도에 따라 합산하거나 혼합 할 수 있습니다.


위 그림에서 초록색의 단계들을 고정 기능 단계 라고합니다. 이 단계를 통해 매개 변수를 사용하여 작업을 조정할 수 있지만 작동 방식은 미리 정의되어 있습니다.


다른 한편으로 주황색의 단계가 프로그래밍 가능합니다. 즉, 그래픽 카드에 자신의 코드를 업로드하여 원하는 작업을 정확하게 적용 할 수 있습니다. 예를 들어 조각 쉐이더를 사용하여 텍스처링과 조명에서 레이 트레이서에 이르기까지 무엇이든 구현할 수 있습니다. 이 프로그램은 많은 GPU 코어에서 동시에 실행되어 여러 객체 (예 : 정점 및 단편)를 병렬로 처리합니다.


OpenGL 및 Direct3D와 같은 이전 API를 사용 했다면 glBlendFunc 및 OMSetBlendState와 같은 호출을 통해 임의의 파이프라인 설정을 변경할 수 있게됩니다. Vulkan의 그래픽 파이프 라인은 거의 완전히 변경할 수 없으므로 셰이더를 변경하거나 다른 프레임 버퍼를 바인딩하거나 블렌드 기능을 변경 하려면 파이프 라인을 처음부터 다시 만들어야 합니다. 단점은 렌더링 작업에 사용하려는 다양한 상태 조합을 모두 나타내는 여러 파이프 라인을 만들어야 한다는 것입니다. 그러나 파이프 라인에서 수행 할 모든 작업이 미리 알려지기 때문에 드라이버는 이를 훨씬 더 잘 최적화 할 수 있습니다.


프로그램 가능한 단계 중 일부는 수행하려는 의도에 따라 선택 사항입니다. 예를 들어 단순 형상을 그리는 경우 테셀레이션 및 지오메트리 단계를 비활성화 할 수 있습니다. 심도 값에만 관심이 있다면 프래그먼트  쉐이더 단계를 비활성화 할 수 있습니다. 이는 섀도우 맵 생성에 유용합니다



다음 장에서는 화면에 삼각형을 배치하는 데 필요한 두 개의 프로그램 가능한 스테이지 인 버텍스 셰이더와 프래그먼트 셰이더를 먼저 만들 것 입니다. 블렌딩 모드, 뷰포트, 래스터 화와 같은 고정 기능 구성은 이후 장에서 설정됩니다. Vulkan에서 그래픽 파이프 라인을 설정하는 마지막 단계는 입력 및 출력 프레임 버퍼 지정과 관련됩니다.


initVulkan에서 createImageViews 바로 다음에 호출되는 createGraphicsPipeline 함수를 만듭니다. 다음 장에서이 함수를 사용합니다.




void initVulkan() {
   createInstance();
   setupDebugCallback();
   createSurface();
   pickPhysicalDevice();
   createLogicalDevice();
   createSwapChain();
   createImageViews();
   createGraphicsPipeline();
}

...

void createGraphicsPipeline() {

}



이전 글 : Image views
다음 글 : Shader modules


'Vulkan' 카테고리의 다른 글

Graphics Pipeline basics - Fixed function  (0) 2018.01.24
Graphics Pipeline basics - Shader modules  (0) 2018.01.24
Presentation - Image views  (0) 2018.01.23
Presentation - Swap chain  (1) 2018.01.23
Presentation - Window surface  (0) 2018.01.23