이번 단계의 가장 중요한 것은 subpass간 attachment가 3개로 늘어난다는 점이었다.
앞에서는 좀 .. 아주 획획 넘어가며 당연한 듯이 적어놓았지만
삽질한 게 좀 많다.
0. 아예 렌더링 자체가 안됐다.
이게 msaa를 없앤 이유가 됐는데 초창기 설계에서 framebuffer는 color, depth, position, normal, albedo, swapchain 이었다.
제일 첫번째오는 color가 msaa용 attachment인데
처음에는 pColorAttachment를 color하나로 놓고 resolve를 position normal albedo 3개로 놨었다.
이러니깐 colorattachment 랑 resolve가 1대 1 매칭이 아니여서 당연히 렌더링이 안됐었고
그래서 고친게 그냥 colorattachment 1개로 3개 그냥 복사해서 1대1 매칭 시켜줬었다.
이러니 렌더링은 됐는데 빛적용이 이상하게 되서 각각 solve 된 attachment들을 봤는데 3개다 똑같았다 ㅋㅋㅋ
생각해보니 마지막 albedo를 렌더링하고 resolve하면서 그대로 position과 normal도 colorattachment를 쓰니깐 복사가 된 것이었다..
다시말해 color -> color -> color 이런식으로 msaa용 attachment가 만들어졌고 마지막 저장된 것이 albedo이니 이걸 토대로 position과 normal, albedo가 저장이되어 전부 msaa resolve된 albedo가 저장되었던 것이다.
이걸 고치려고 각 msaa용 attachment들을 각각 만들어서 넘겨주려고 하다가,
이러면 샘플링이 3번되는거 아닌가.. 너무 안좋지 않나... 라고 생각해서 gpt돌려봤더니 아니나 다를까 deferred shading 할 때는 msaa가 너무 비효율적이라고 안쓴댄다.
얼른 msaa포기하고 anti aliasing은 후처리로 처리하자 라고 다짐했다.
1. assimp로 받아온 model들이 빛 적용이 더 이상하게 적용된다. (물론 초반에는 전부 이상하게 보였었다.)
이건 assimp에서 normal 받아 올 때 상수를 때려 박았었다.
심지어 초반에는 왜 그런지 몰라서 한참 고민하다가 각 attachment들을 하나하나 렌더링 해봤는데 그제서야 model이 한 색깔로 통일되어있는걸 보고 알았다.
이건 뭐 실수라서 귀엽게 넘어감
2. 광원이 왼쪽으로 가면 빛적용이 안된다. + 구는 빛적용이 잘됐는데 이상하게 박스와 플레인이 빛 적용이 이상하게 된다. + 특정 위치에 광원이 들어가면 배경까지 빛나는 순간이 있다.
다 다른 이유라 생각하고 디버깅 중이었는데 같은 원인이었다.
원인은 framebuffer생성할 때 format 때문이었다.
나는 그냥 swapchain과 통일하려고 format을 전부 swapchain용 format으로 맞춰놨었다.
이러고 난리난 상태로 처음부터 고쳐가는데
왼쪽이 빛적용이 안되서 얘가 음수는 저장을 안하나? 싶어서
normal값만 (-1, 1) 에서 (0, 1)로 바꿔 저장한 후에
나중에 lightingpass fragment shader에서 다시 풀어서 써서 고쳤었는데
여기서 이상함을 감지했어야했다...
한참을 뻘 짓 하다 생각난게
아니 position, normal 다 똑같이 만들었잖아. 그럼 position도 음수 저장을 못하네? 이게 맞나?
하고 옵션들을 뒤져보니깐 swapchain 포맷은 애초에 [0, 1]값이 맞고 다른 값을 저장하려면 다른 format을 맞춰야했었다.
그래서 framebuffer 생성할 때 format을 VK_FORMAT_R16G16B16A16_SFLOAT 이걸로 맞춰주니깐
이번엔 에러가 쫘자작 나서 보니 framebuffer만 바꿀게 아니라 renderpass도 바꿔줬어야지..
다 바꾸니깐 빛적용이 잘되더라.. 저 3가지 이슈를 한방에 해결했다..ㅎ
3. 창을 최소화 or 크기 변경하면 터짐
언제부턴가 습관처럼 렌더링하면 화면크기 한번 바꿔보는데 언제부터 생긴 ptsd인지 모르겠다.
쨋든 이번에도 터졌고
기존의 창바꿈은 swapchain과 framebuffer만 다시 생성해줬는데 이번에는 스케일이 좀 다르다.
일단 의식의 흐름으로 재생성해주니깐 됐다. 한번 따라가보자
1. 창크기가 변경됐다 -> swapchain 재생성
2. framebuffer는 제일 마지막에 swapchain을 가지고있다. -> framebuffer 재생성 (여기까진 이전과 동일)
3. 지금 이 framebuffer와 renderpass가 강결합 아닌가? -> renderpass 재생성
4. pipeline이 renderpass를 쓰는데? -> pipeline 재생성
5. 아니 그러고 보니깐 framebuffer에서 일부 attachment들은 descriptorset에서도 사용하잖아? -> descriptorset 재생성
해서 역순으로 다 초기화를 해주니깐 에러 없이 되더라... 이게 맞나..
이러면 왜 예전에는 swapchain과 framebuffer만 재생성해서 됐는지도 모르겠다.
gpt는 운이 좋았댄다. 얘가 이런말도 하는 줄 몰랐다.
쨋든
1. 지금 잘되고있는 렌더링에 서브패스만 추가해서 감마값만 바꿔보기 - 서브패스 추가하기
2. 이 서브패스에 유니폼 버퍼를 추가해보기
3. 택스쳐도 넣어보기 <- 요녀석은 그냥 했다 치고 다음단계로 넘어가야겠다. 어렵지 않기에
4. 지연 렌더링 기본 구현하기 - 퐁모델로 간단하게
5. pbr적용
6. 렌더패스 추가하여 쉐도우맵 생성해보기 - 일단 방향성 광원으로
7. 이걸 받아서 그림자 만들어 보기
8. 렌더 패스 동적 생성 - 빛의 개수만큼
9. 다중 광원 적용 - 방향성 광원만
10. 큐브맵 활용해서 점광원 + 스포트라이트까지 추가
4단계 해결!
이거 단계 진짜 대충 생각나는데로 적은건데 이렇게 요긴하게 써먹을줄 몰랐다.
5단계 가기전에 이번에 디버깅하면서 느낀건데
지금 입력을 아예못해서 카메라도 광원도 바꿔주려면 컴파일을 다시 해줘야했다.
디버깅이 너무 힘들어서 디버깅용 imgui를 써서 연결하고 입력도 받게 바꿔놔야겠다.
사실 다른 동료분이 지금 하고 계신거 같은데
지금 이거 없으면 앞으로 진행이 어려울거같아서 간이로 해놔야지
'Computer Graphics > Vulkan' 카테고리의 다른 글
Vulkan - 9. pbr 적용 전략 (0) | 2025.01.03 |
---|---|
Vulkan - 8. 키보드 마우스 입력 추가와 imgui 적용 (1) | 2025.01.02 |
Vulkan - 6. deferred shading + phong shading 구현 (code) (0) | 2024.12.30 |
Vulkan - 5. 두번째 Subpass에 uniform buffer추가 (0) | 2024.12.26 |
Vulkan - 4. 감마 셰이더 추가해보기 (0) | 2024.12.26 |