2021. 8. 9. 03:03ㆍ그래픽스/vk
- 그래픽 파이프라인을 설정해야함.
- 그래픽 파이프라인은 vertices과 texture를 render targets의 pixels까지 가져오는 일련의 operations임.
1. Input assembler
- raw vertex data를 수집함 (작성자가 명시한 buffers로부터)
- index buffer를 사용하여, vertex data를 복제하지 않고 특정 요소를 반복할 수 있도록 함.
- (메모리에서 기하 자료를 읽어 기본 도형 형성
2. vertex shader
- 모든 vertex에 대해 실행.
- transformations를 적용해 vertex positions을 model space에서 screen space로 변환
- 또한 per-vertex data를 다음 단계로 전달할 수 있음.
3. Tesselation
- 특정 규칙을 기반으로 잘게잘게 geometry를 분할
- mesh quality를 증가시킴 ( 더 부드러움)
- 종종 벽돌벽이나, 계단 같은것의 표면을 덜 평평하게 보이게함 (when they are nearby)
- 고정 단계 (Hull shader, Domain Shader 는 프로그래밍 가능한 단계)
4. geometry shader
- 모든 primitive (삼각형, 선, 점)에 대해 실행
- 특정한 primitive를 삭제하거나, 입력보다 더 출력하게 할 수 있음.
- tessellation shader와 유사하지만 더 유연성있음.
- 하지만 오늘날에선 많이 사용하지않음
- 대부분 graphics card에서 좋은 성능을 보이지 않기 때문(intel의 integrated GPU는 예외인듯)
5. rasterization stage
- fragments로 primitives를 이산화시키는 단계 (픽셀로 변화됨)
- fragments은 framebuffer에 채워지는 pixel elements이다.
- screen 밖에있는 fragments은 제거됨.
- vertex shader에 의해 받은 attributes은 fragments에 걸쳐 보간됨(interpolated)
- 보통 fragments은 뒤에 다른 fragments가 있을 경우 (겹쳐) depth testing에 의해 제거됨. (나중에)
- 원근 투영(z 나누기), clipping, culling, viewport mapping, fragment shader 선택 및 호출의 작업을 거침
- 'pixel'로 변환되어 fragment Shader에 넘김.
6. fragment shader
- 절단 등에 의해 살아남은 fragment에 대해 호출되며,
- fragments이 어느 framebuffer에 쓰여지고 어떤 color 및 depth values로 쓰여지는지 결정
- 넘어온 보간된 vertex attributes에 따라 이런 값들을 결정.
(attributes : 텍스쳐 좌표, 조명 법선 과 같은것들을 포함)
7. color blending -> framebuffer
- 프레임 버퍼의 동일한 픽셀에 매핑되는 여러 fragments을 혼합하는 작업을 적용함
- fragments은 단순히 서로 겹쳐 쓰거나, 투명도(transparency)에 따라 합산하거나, 혼합할 수 있음.
- 이러한 작업을 통해 일부 픽셀들이 제거(깊이 테스트, 스텐실 테스트)
- 이렇게 제거되지 않은 픽셀들은 framebuffer에 저장됨
- 그래픽 파이프라인을 설정하는 마지막 단계는 입출력 프레임버퍼 지정과 관련있음
위의 그림에서 초록색 단계들
- fixed-function stages (고정 기능 단계)
- 이 단계를 통해 매개변수를 사용하여 작업을 조정할 수 있지만
(tweak their operations)
- 미리 정의된 작동방식을 따름
위의 그림에서 주황색 단계들
- programmable
- 작성자 자신의 코드를 그래픽 카드에 업로드 가능
- 작성자가 원하는 작업을 정확하게 적용할 수 있음
- ex) fragment shaders : texturing 과 lighting에서 ray tracers에 이르기 까지 무엇이든 구현 가능하다.
- 이런 프로그램은 많은 GPU코어에서 동시에 실행하여 여러 객체를 처리
(vertices and fragments in parallel)
- 여기서 이런 단계들은 수행의 의도에 따라 선택사항임.
- ex) tesselation 과 geometry 는 단순한 geometry를 그릴때 생랼가능
- ex) depth values에만 관심이 있으면 fragment shader stage 비활성화 가능
(shadow map generation에 유용)
다른 API와의 차이
- OpenGL이나 D3D 이전버전 같은 경우 glBlendFunc 및 OMSetBlendState 함수들을 호출하여
- 임의의 파이프 라인 설정을 변경할 수 있었다.
- Vulkan의 그래픽 파이프 라인은 거의 완전히 변경할 수 없음 (파이프라인을 생성하여 사용)
(completely immutable)
- 셰이더를 변경하거나, 다른 프레임 버퍼를 바인딩하거나 블렌드 기능을 변경하려면
- 파이프라인을 처음부터 다시 만들어야함.
- 단점 : 렌더링 작업에 사용하려는 다양한 상태조합을 모두 나타내는 여러 파이프라인을 만들어야함
- 장점 : 파이프 라인에서 수행할 모든 작업이 사전에알기때문에 드라이버는 이를 훨씬 더 최적화
삼각형에서의 쉐이더
- programmable stage
- - - - vertex shader, fragment shader 이 두가지는 화면에 나타내기위해서 필수.
- fixed-function stage
- - - - blending mode , viewport, rasterization 을 설정해야함.
- 그래픽 파이프라인을 설정하는 마지막 단계는 입출력 프레임버퍼 지정과 관련있음
createGraphicsPipline
- initVulkan에서 createImageViews 직후에 파이프라인을 생성해야한다.
- 다음장에서 이 함수를 구체적으로 구현함.
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createGraphicsPipeline();
}
...
void createGraphicsPipeline() {
}
링크:
https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Introduction
https://openmynotepad.tistory.com/83?category=1020021
'그래픽스 > vk' 카테고리의 다른 글
[vk] Drawing triangle - graphics pipeline basics - Fixed functions (0) | 2021.08.09 |
---|---|
[vk] Drawing triangle - graphics pipeline basics - Shader modules (0) | 2021.08.09 |
[vk] Drawing triangle - Presentation - Image views (0) | 2021.08.09 |
[vk] Drawing triangle - Presentation - Swap chain (0) | 2021.08.07 |
[vk] Drawing triangle - Presentation - Window surface (0) | 2021.08.06 |