전체 글(30)
-
Vulkan instance와 device 확장들
개요 Vulkan API를 이용할 때는 인스턴스를 가장 먼저 생성해야 하며, 여기서는 기본 기능 외에 사용할 필요가 있는 확장 기능을 명시해야 합니다. 저수준 인터페이스까지 제공하길 원한다면, 그 중 사용할 만한 것을 선택지로 주는 것이 바람직하겠죠. 그러니 한번 알아 봅시다. 가장 좋은 것은 공식 문서를 보는 것이지만 한 군데 모아 둔 것이 없어 꽤 보기 힘들었기 때문에 작성하는 것이에요. 물론 이 중에 제 수준에 실제로 몇 개나 사용하겠냐마는.. Vulkan의 이점을 최대한 활용하려면 이걸 알아서 런타임에 가능한 확장을 얻어내어 필요한 방식을 선택하는 게 이론상 좋겠죠? 또한 모르는 영역은 언제나 무섭기 때문에 최소한 '몰라도 된다'를 알기 위한 것도 도감 만들기의 목적 중 하나입니다. * https..
2022.09.18 -
안드로이드 스튜디오 NDK와 Vulkan - 1
개요 저는 본업이 생기면서 새로운 Vulkan 기반 렌더링 프레임워크 설계 구상에 많은 차질이 생겼고(여름이라 더워서 스스로에게 핑계를 대 봅니다.) 뭔가 새로운 자극이 필요했습니다. 여러 가지 선택이 있지만 그 중 안드로이드 플랫폼으로의 Vulkan 연결을 먼저 하는 걸 선택했습니다. 기본적으로는 다수의 자료가 여기를 가리키는데요, 그 내용만 보면 기존의 소스를 기반으로 수정하는 것만 가능한 게 아닌가 생각도 듭니다. 아무래도 그것보단 많이 알아야겠죠. 따라서 그보다 앞인, 안드로이드 스튜디오에서의 NDK 사용 방법부터 시작하여 창 표면 통합 등 다른 코드의 커버까지 들어가는 식으로 진행해 보겠습니다. 제목에서 알 수 있듯 글 하나로 끝내지 않았습니다. 이 글에서 커버하는 범위는 딱 Android 스튜..
2022.08.21 -
Vulkan - 12. 동적으로 여러 텍스처를 사용하기
개요벌칸에서 텍스처를 사용하는 것을 일부 소개했던 7번 글에서는 텍스처를 사용하는 기본적인 방법 중 하나인 combined image sampler를 기술자 집합으로 가리켰었습니다. 여기서는 (저보단) 숙련된 벌칸 개발자들이 제시한, 런타임에 임의의 객체별 텍스처를 바인드할 수 있는 몇 가지 접근을 하나씩 구현해 보겠습니다. (사샤 윌리엄스와 니콜 볼라스는 둘 다 벌칸 질문하면 바로 나오는 사람으로 보이는군요.. 아주 존경합니다) 목차1. 필요한 것2. 접근 1: 기술자 집합을 많이 만들기3. 접근 2: arrayLayers를 사용하기4. 접근 3: 기술자 집합 하의 기술자 여러 개를 모두 이미지를 위해 사용하기요약과제 본문1. 필요한 것GL에서와 달리 벌칸에서의 uniform의 핵심은 다음과 같습니다...
2022.07.17 -
Vulkan - 11. 동적 공유(uniform) 버퍼
개요벌칸은 버퍼에 명령을 기록하고 한 번에 제출할 수 있으며, 제출하면 그래픽카드가 일을 하기 시작하지만 그와 관계 없이 함수는 리턴하며 CPU는 그 동안 다른 일을 할 수 있습니다. 이에 따라 공유 버퍼 하나만 가지고는 여러 draw 명령에 대하여 다른 uniform 값을 줄 수가 없었습니다. 명령 버퍼에서 값을 가지고 가는 푸시 상수라는 방법은 동기화 문제도 없고 효율적이지만 사실상 파이프라인당 128바이트 정도만 사용할 수 있습니다. 그렇기 때문에 4번 글에서는 물체별로 다른 값을 가지게 되며 개별 용량이 큰 bone structure 같은 케이스에 대한 공유 버퍼를 해결하지 못했습니다. 결국에는 그려야 할 개별 물체의 행렬들을 모두 기술자 안에 가지고 그것을 가리키는 방식으로 가야 하며, 그 방법..
2022.07.02 -
Vulkan - 10. Vulkan Memory Allocator(VMA)
개요그래픽스 프로그램에서는 그래픽 카드 상 메모리 할당 수에 한계가 있습니다. 한계에 부딪치지 않더라도 한 번의 할당으로 여러 객체를 위하여 메모리를 사용하는 것이 성능상 유리하다고 그래픽 카드 제조사로부터 알려져 있다고 합니다. 이것을 관리하는 구조를 직접 만드시려면 만들 수도 있겠지만 그런 부분일수록 실수하기도 쉬운 주제에 실수했다는 사실 자체를 깨닫는 것도 어렵습니다. 성능 검증도 쉽지 않을 거고요. 때문에 메모리 관리를 효율적으로 하게 해 주는 오픈 소스 라이브러리인, GPUOpen의 Vulkan Memory Allocator를 사용하는 것을 권장합니다. 이것은 단일 헤더(현 버전 기준, 약 2만 라인)로 구성되어 있으며 MIT 라이센스 아래에서 사용할 수 있습니다. 이 라이브러리는 공식 문서가 ..
2022.06.29 -
Vulkan - 9. 파이프라인 동적 상태
개요삼각형을 처음 만들기 직전에 파이프라인을 만들 때 몇 가지 동적으로 바꿀 수 있게끔 구성할 수 있다고 하며 이 문서로 연결해 드린 적이 있습니다. 1.0 버전을 기준으로 뷰포트/시저/선 굵기/깊이 바이어스/블렌드 상수/깊이 경계값/스텐실 마스크/스텐실 참조값이 그렇게 설정 가능한데, 여기서는 뷰포트와 시저를 런타임에 조정할 수 있게 해 보겠습니다. 목차1. 스왑체인 재생성2. 뷰포트의 종횡비를 유지하기3. 동적 조절요약 본문1. 스왑체인 재생성뷰포트를 바꿀 일은 창 크기를 바꾸는 경우에나 필요할 일입니다. 하지만 지금은 창 크기를 바꿀 준비가 안 돼 있습니다. 프로그램을 틀어서 한 번 최소화해 봅시다. 콘솔은 vkAcquireNextImageKHR의 호출에서 실패했다는 의미의 Fail 1로 가득 찰 ..
2022.06.28