분명 이전 포스트에서 앞으로의 글은 vulkan을 공부하는 메모장이 될 것 이다라고 했는데
메모는 그냥 진짜 메모장에 써버렸다..ㅎ
제목과 같이 내가 생각한 step의 첫번째 단계인 간단한 gamma shader를 추가해
renderpass에서 subpass를 연결하여 두개의 subpass를 연결하는 작업을 완성했다.
일단 결과물


왼쪽에서 오른쪽만드는데 너무 오래걸렸다.
vulkan을 너무 쉽게보고 접근한게 화근이였다.
어떤식으로 어떤 순서로 변경해 셰이더를 추가해줄 수 있었는지 기록해보려한다.
우선 opengl처럼 무지성으로 셰이더를 추가해줄 수는 없다.
추가해줘야하는 코드가 너무 많기 때문에
할 일을 적어놓고 한 일은 체크해주는 방식으로 추가해줘야 나중에 안 헷갈리고 해줄 수 있다.
전에 실패했었던 기억을 되살려 내가 어느부분에서 못해줘서 실패를 했는지 기록도 해야겠다.
1. shader 추가
간단하게 감마값을 변경해주는 코드라 쉽게 쓰고 넘어갔는데
layout(input_attachment_index = 0, set = 0, binding = 0) uniform subpassInput resolvedImage;
이런식으로 서브패스의 이미지를 받겠다고 썼어야 했다. 나는 바보같이
layout(binding = 0) uniform sampler2D inputTexture;
요런식으로 썼었기에 첫단추부터 잘 못 되었다.
* 셰이더를 추가해줄 때 렌더패스의 어느부분인지 생각하여 처음부터 설계하자!
2. swapchain framebuffer 변경
기존 스왑체인 프레임버퍼가 컬러, 뎁스, 스왑체인 이미지(제출용) 으로 구성되어있었는데
서브패스간 연결해줘야하기 때문에 + msaa가 적용되어있기 때문에 이미지를 하나 추가를 해줬어야 했다.
그래서 컬러, 뎁스, 리졸브, 제출용 이미지로 중간에 하나를 추가해줬다.
* 렌더패스와 프레임 버퍼가 밀접한 관계를 가지므로 동일하게 어태치먼트를 설정해야한다!
3. descriptorset layout 추가
shader추가해줬으니 descriptorset layout을 shader에 맞춰 추가해줘야한다.
VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 이 옵션으로 하나 추가해주자
* shader와 descriptorset layout은 밀접한 관계를 가진다. shader 추가/변경 해줄 때마다 꼭 한번씩 보자!
4. descriptorset 추가
gamma shader용으로 앞에서 layout추가해줬으니 그걸로 descriptorset 만들어야한다.
이때 input image가 swapchain framebuffer의 resolve image를 연결해줘야한다.
저번에 실패했을 때는 이걸 전혀 고려를 안했으니 여기저기서 터져나갔었다.
5. renderpass 추가
subpass 2개를 연결한 renderpass를 만들어줘야한다.
전에것은 3가지 attachment로 color depth resolve였었고
이 resolve가 present옵션을 가지고 있어 swapchain image와 연결되어있었는데..
좀 자세하게 설명하자면..
기존 렌더패스는 3가지 attachment가 있었다. - color, depth, resolve
resolve가 있는 이유는 msaa옵션 때문이다.
color attachment가 msaa 옵션이 걸려있어 제출용 이미지로 만들려면 이 이미지를 단일 이미지로 풀어줘야했다.
하지만 거기에 추가하여 present옵션까지 걸려있어 resolve와 동시에 swapchain 제출용이 되어버렸는데
subpass가 2개가 된이상 resolve attachment는 subpass 0번과 1번의 연결점이 되고
swapchain제출용 attachment는 따로 만들어야 한다. 물론 이게 프레임버퍼의 attachment와도 연결되어있어야 했고
저번에는 이런 개념을 전혀 모르고있어 스왑체인은 attachment가 3개인데 renderpass에서는 4개였으니 잘 될리가 없었다.
* 위의 내용 전부가 중요하다!
6. pipeline 추가
초기화하는 코드가 엄청 긴데
이 녀석이 날 힘들게 했던 경우는 오히려 없었다. 길지만 옵션이 다 직관적이다.
shader 잘 받아와서 이어주고 옵션들 잘 적어주고
renderpass잘 받아와서
이 pipeline은 renderpass의 몇번째가 될거다! 라고 선언만 해주면 끝
* 효자
7. rendering 부분 추가
renderpass 선언 -> pipeline 선언 -> descriptorset 선언 -> uniform 넣기 -> draw호출
-> pipeline 선언 -> descriptorset 선언 -> draw 호출 -> command buffer 제출
이건 별로 어렵지 않고 직관적이다.
* 얘도 효자
어쨋든 renderpass에서 subpass 두개 연결하는 작업을 완료하였다.
해보니깐 좀 더 vulkan에 대해 안 기분이다.
이제 좀 속도가 붙었으면 좋겠다..
이제 1단계 완료했으니 2, 3단계가 두번째 subpass에 유니폼 추가하는거고 4단계가 간단한 defer phong shading이다.
1. 지금 잘되고있는 렌더링에 서브패스만 추가해서 감마값만 바꿔보기 - 서브패스 추가하기
2. 이 서브패스에 유니폼 버퍼를 추가해보기
3. 택스쳐도 넣어보기
4. 지연 렌더링 기본 구현하기 - 퐁모델로 간단하게
5. pbr적용
6. 렌더패스 추가하여 쉐도우맵 생성해보기 - 일단 방향성 광원으로
7. 이걸 받아서 그림자 만들어 보기
8. 렌더 패스 동적 생성 - 빛의 개수만큼
9. 다중 광원 적용 - 방향성 광원만
10. 큐브맵 활용해서 점광원 + 스포트라이트까지 추가
'Computer Graphics > Vulkan' 카테고리의 다른 글
Vulkan - 6. deferred shading + phong shading 구현 (code) (0) | 2024.12.30 |
---|---|
Vulkan - 5. 두번째 Subpass에 uniform buffer추가 (0) | 2024.12.26 |
Vulkan - 3. 벽을 느낌 (1) | 2024.12.24 |
Vulkan - 2. Scene 구성 (0) | 2024.12.20 |
Vulkan - 1. 전반적인 전략 (0) | 2024.12.12 |