1. 기본 프레임버퍼 (렌더링을 하기 위한 버퍼) 없음. => 직접 만들어야 함. Z버퍼나 Stencil버퍼, Color 버퍼까지 다
2. 파이프라인을 명시적으로 다 만들어 줘야 함. 스왑체인 (렌더링 버퍼 갈아끼우기를 하기 위한 것), 렌더패스(렌더링에 필요한 정보를 명시해주는 것) 등등
3. 버퍼 메모리 할당의 최대 제한 수가 존재 (4096개) => 실 어플리케이션에서는 큰 풀을 만들어서 거기에다가 여러가지를 할당해줘야...
4. 텍스쳐나 일반 정점 버퍼들을 바로 불러와서 파이프라인에 적재하면 X => Layout 이라는게 있고, Layout 에 버퍼가 적재될 수 있도록 미리 콜을 해줘야 함
5. OpenGL 과는 다르게 내부 상태 (블랙박스) 자체가 없으니 명시적이고, 오브젝트 지향적이지만, 그만큼 코드가 매우매우 길어짐. 이건 Dx12도 마찬가지일듯.
6. Vulkan 은 렌더링해서 무언갈 보여주는 것 자체가 확장 기능임. 기본적으로는 지원 X.
7. Vulkan 은 렌더링이 비동기적으로 이루어지기 때문에 세마포어, 펜스, 배리어 다 써서 CPU 단에서 동기화시키는 코드를 짜줘야 함. (이를 위한 API 는 제공해줌)
8. Vulkan 은 디버그 로그 기능 역시 확장 기능임 (Validation Layer 라 해서)
9. 텍스쳐, 유니폼 변수와 같은걸 쓰려면 리소스 서술자 (Resource Descriptor) 라는걸 따로 만들고, CPU 와 GPU 간의 메모리를 따로 둬서 맵핑을 하지 않으면 안됨
10. 위의 모든 번거로운 사항들은 다 성능을 위해서 의도적으로 설계된 것 같음 ㅋㅋ 덤으로 OpenGL 이나 Dx11 와 같은 추상화된 API을 사용해서 뭔갈 해보지 않았으면 이거 하다가 초기화 과정부터 막힌다에 95%.
11. 위의 짤까지 구현하는데 3000줄 정도 쓴 듯. 고통스러운데 OpenGL 같이 블랙박스에게 영고하고 싶지 않은 마음이 어느정도 있었다면 쓰면서 그 특유의 해방감같은 쾌감은 있을 듯.
푸크시아OS랑 GODOT에서 쓰고 있지