원래 주석 포함 2500줄 정도 되는 튜토리얼 코드를 역할 분할하여 클래스화 하니 3200줄 정도가 나왔고
이걸 파일로 나눠보니

이 정도의 파일량이 나왔는데
그래도 한 2주간 공부하며 지지고 볶고 하니 내손이 안 닿은 곳이 없어서 나름 친숙하게 느껴지는 친구가 되었다.. 고 생각했었다.
렌더링을 간절히 기다리는 동료들을 위해 뭐라도 보여주기위해 간단한 빛이 적용되는 지연렌더링 정도만 보여주려고 이제 코드를 수정하는데..
생각보다 쉽지가 않아서
먼저 단계별로 한번 진행해보자 생각했다.
우선 목표는
1. 쉐도우맵을 활용한 (점 광원, 스포트라이트, 해 같은 광원(이름이 갑자기 기억이 안난다..)) 그림자 적용
2. 지연 렌더링 + pbr적용
일단 광원 하나가 목표이지만
다중 광원까지는 해야만한다.

어쨋든 이걸 하려면
그림자 적용 -> 렌더패스 하나 혹은 광원만큼 동적으로 생성해서 쉐도우 맵을 만들고 메인 렌더패스에서 이걸 참고할 수 있게 만들어야한다.
+ 점 광원은 큐브맵을 활용할테니 큐브맵 쓰는 법도 알아야겠다.
지연렌더링 -> 메인렌더패스에서 서브패스를 써서 이을 수 있어야겠다.
+ 빛적용 할 때는 엄청 많은 샘플러들을 받아서 활용할 줄도 알아야한다.
차근차근 연습해보기위해 단계별 적용을 목표로 하고
이런식으로 루트를 짰었다.
1. 지금 잘되고있는 렌더링에 서브패스만 추가해서 감마값만 바꿔보기 - 서브패스 추가하기
2. 이 서브패스에 유니폼 버퍼를 추가해보기
3. 택스쳐도 넣어보기
4. 지연 렌더링 기본 구현하기 - 퐁모델로 간단하게
5. pbr적용
6. 렌더패스 추가하여 쉐도우맵 생성해보기 - 일단 방향성 광원으로
7. 이걸 받아서 그림자 만들어 보기
8. 렌더 패스 동적 생성 - 빛의 개수만큼
9. 다중 광원 적용 - 방향성 광원만
10. 큐브맵 활용해서 점광원 + 스포트라이트까지 추가
대충 이런식으로 짰었다. opengl에선 어렵지 않게 느껴지는 것들이다.
근데 1단계에서 벽을 느꼈다.
기존에 잘되고 있는 렌더링에 그냥 서브패스 하나 추가해서 감마값만 바꿔보는거..
이거 하나도 잘안된다.
우선 내가 지금 어떻게 했는지 써놓고 나중에는 뭐 이정도는 쉽게 잘할테니 (제발..)
그때 한번 비교해봐야지
일단 실패했을 때 로드맵이다.
1. 렌더 패스를 바꾼다. - 서브패스 하나 추가하고 이어주는 작업을 해야한다.
내가 봤을 때 이 때 옵션이 더럽게 많은데 이걸 잘못해서 실패한 거 같다.
조금만 자세하게 보자면 color, depth, resolve attachment 정의는 건드리지 않았다.
subpass정의만 0번 1번 만들어서 잇는 작업만 해줬었다.
2. 파이프라인을 하나 더 만든다.
셰이더는 간단해서 금방 만들었고 파이프라인은 기본옵션으로 gpt에 물어물어 만들었었다.
3. 이때 파이프라인 만들려고 디스크립터 셋 레이아웃을 만들었다. 지금보니 이것부터 만들어야했다. 샘플러 하나 들어가게 만들었다.
4. 디스크립터 셋 만들었다. 샘플러 하나 들어가게 만들었다. 이때 유니폼버퍼는 안만들었다. 그냥 받아서 감마값만 변경해주는 셰이더기 때문에
5. 스왑체인 프레임버퍼 만들때 렌더패스를 새로 만든 렌더패스로 변경해줬다.
6. 직접렌더링하는 부분에서 파이프라인바인딩 -> 디스크립터셋바인딩 -> 드로우 * 2 로 바꿔줬다.
결과는 실패
여러 에러가 나왔는데 종합해보면
1. 렌더패스와 프레임버퍼 호환문제
2. attachment 옵션 중 옵션이 샘플러로 넘겨주는? 옵션이 아니였던 거 같음
3. 디스크립터셋 업데이트 문제
4. 스왑체인 이미지 옵션 문제
5. 너무 많아서 기억도 안난다
6. 사실 보면서도 뭐가 터진지 모르겠었다. 쓴 것들도 사실 명확하게는 잘 모르겠다.
사실 보면서 닥치는대로 고치다보니 어떤 문제가 있었는지도 잘 모르겠다. 적어 놨어야 했다.
실패 이유는 생각해봤을 때
1. 큰그림을 그리지않고 닥치는 대로 해결하다보니 실수가 많이 있었던거 같다. 위의 방식을 미리 짜고 생각한게 아니라 그때 그때 생각해 바꿔줬다.
2. 일단 셰이더 추가할때 추가해야하는 코드가 너무 많다. -> 이건 어쩔 수 없고
3. 내가 옵션들을 너무 모른다!!
4. 내가 옵션들을 너무 모른다!!
5. 내가 불칸에 대해서 너무 모른다!!
하나의 셰이더로 하나의 모델 출력하는 튜토리얼 코드 기반이다 보니깐
필요한 자원들 생성할 때 저 코드기반에서 생성하다보니 바꿔야 할 옵션들이 많고
나는 그것에 대해 정확하고 자세하게 잘 모르는게 제일 큰 문제이다.
그래서!
코드 짤게 아니라 공부를 해야겠다.
잠시 코드를 놓고 자원생성할 때의 옵션들을 하나하나 살펴보고 어느때 어느 옵션인지 좀 적어놔야겠다.
다음 포스트 부터는 그냥 내 메모장이다.
아마 물어물어봐서 쓸만한 gpt글과
https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html을 참고한 글이 두서없이 나열될 예정
'Computer Graphics > Vulkan' 카테고리의 다른 글
| Vulkan - 5. 두번째 Subpass에 uniform buffer추가 (0) | 2024.12.26 |
|---|---|
| Vulkan - 4. 감마 셰이더 추가해보기 (0) | 2024.12.26 |
| Vulkan - 2. Scene 구성 (0) | 2024.12.20 |
| Vulkan - 1. 전반적인 전략 (0) | 2024.12.12 |
| Vulkan - 0. 시작 전 (0) | 2024.12.07 |