Vulkan tutorial 4. Fixed Function Pipeline Stages
tutorial 3의 연장선
이전에 1강에 나왔던 fixed function stage의 세팅을 맞춘다고 생각하면 된다.
해당 링크 : https://youtu.be/lr93-_cC8v4
우선 PipelineConfigInfo 구조체를 구성하는 파트부터 시작하자.
VkPipelineInputAssemblyStateCreateInfo (input Assembly)
graphics pipeline에서 inputAssembly는 vertices들을 모아놓은 배열에서 vertex를 분류하고 그다음 도형을 분석한다.
그러면 vertex로 이루어진 도형들을 어떻게 특정할 수 있을까? => 그것을해주는 것이 topology
(수학에서 생각하는 토폴로지의 개념적인 부분을 가져왔다고생각하면 조금 편하다)
그러면 triangle list로 하면 v1 v2 v3 가 한 삼각형, 그리고 v4 v5 v6가 두번째 삼각형을 이루게 된다.
triangle strip이란 v1 v2 v3 v4가 있다면 T1(triangle) 은 v1, v2, v3로 이루어져 있고, T2는 v2, v3, v4로 이루어져있다.
각 폴리곤들이 연결되어 있어야 한다는 단점은 있지만, 메모리를 아낄 수 있다.
Viewport and Scissors
Viewport : 파이프라인의 output과 target image간의 변환을 설명
- 우리가 tutorial2 에서 했던 gl_position에서는 NDC를 사용하였지만, 결국 Framebuffer에 넣을때(이미지가 표현 될 때는)는 좌측 상단이 (0, 0) 우측 하단이 (width, height)로 변환해줘야 한다. 여기서 width, height의 값을 바꿔주면 창을 기준으로 삼각형을 왜곡한다.
- minDepth 그리고 maxDepth는 gl_Position의 Z component와 비슷한 역할을 한다.
Scissor: 뷰포트의 일종 triangle을 왜하는 게 아니라 잘리버린다.
Viewport와 Scissor를 다 설정해 주었다면, viewport info에 해당 설정을 저장해준다. (몇몇 gpu는 viewportcount와 scissorcount를 늘려줄 수 있지만, 우리는 그냥 한개만 해주자.)
Rasterization Stage
Rasterization은 fragment로 넘길때 triangle에 overlap 되는 pixel들을 판단해주는 부분
DepthClampEnable : gl_Position의 z component를 0과 1사이로 강제하는 부분 일반적으로 false로 한다
rasterizerDiscardEnable : all primitive를 discard할것인가 내가 그래픽 파이프라인의 처음 몇 스테이지만 쓸때 사용(이부분은 좀 이해가 안감)
polygonMode : 삼각형의 코너만 찍을건지 edge까지 그릴건지 혹은 안에 다 채울건지 표현하는 부
cullmode : 이부분은 내가 좀더 찾아봐야함
frontFace : 앞부분을 볼건지 뒷부분을 볼건지 결정해주는 부분 clockwise 그리고 counterclockwise부분
Multisampling
멀티샘플링 anti-aliasing과 관련된 부분 -> 사선을 좀더 자연스럽게 보이게 하는 부분
ColorBlending
colorblending은 색배합 관련한 부분이다. 두가지의 삼각형이 overlap되었을 때 어떻게 표현할 것인지에 대한 부분
Depth Stencil
frame buffer에추가적으로 붙여지는 버퍼 ( 각 픽셀부분이 앞면에 표현할지 뒷면에 표현할지에 대한 부분이다.)
0 (가까움) ~ 1 (멀음)
VkPipelineVertexInputStateCreateInfo
- 불칸에서 vertexpipeline 인풋스테이트를 생성할때 (vertex 버퍼가 어떤 형식으로 들어가냐) 필요한 정보에 대한 구조체이다.
VkGraphicsPipelineCreateInfo
- 우리가 그래픽 파이프라인에서 사용할 모든 정보들을 가지고 있는 구조
stageCount, pStages는 우리가 vertex와 fragment 에서 사용할 shaderStages 배열을 가져와야함
결국, pipelineconfiginfo를 pipeline 클래스의 밖으로 꺼내서 instance들 끼리 영향을 미치지 않도록 사용하게 한 느낌이 든다. (사견)
그리고 validation layer를 보면 디버깅을 할때 꽤나 도움이 된다.