소개
게시글
질문&답변
2024.08.06
descriptorCount 에 대한 질문
VkDescriptorPoolSize 에서는 동기화 관련 작업을 할때 descriptorCount를 스왑체인 이미지의 개수로 정의합니다. 아마 강의 뒷부분에 나올겁니다.그런데 남은 2부분은 저도 궁금한데요1)VkDescriptorSetLayoutBinding 에서 discriptorCount가 2가 된다면, 하나의 디크스립터 세트 레이아웃 바인딩이 두 개의 디스크립터와 연결 될수 있다는 의미인데,1이 아닌 코드는 못본것 같습니다. 2) VkWriteDescriptorSet 에서 discriptorCount가 2가 된다면,디스크립터 세트의 내부 디스크립터가 두개인데, pBufferInfo에서 버퍼를 하나밖에 지정을 못하니,두 개의 디스크립터가 하나의 리소스를 공유 하는 것처럼 되어버리는데, 이것도 1이 아닌 코드를 저는 못봤습니다.
- 0
- 2
- 107
질문&답변
2024.08.05
descriptorSet에 대한 질문들
지나가다가 남깁니다.제가 아는 내용을 대략 적어 보았는데요, 삼각형 님이 덧붙여주시면 저도 더 공부가 되고 좋을 것 같습니다.descriptorSet을 descriptorPool에서 할당 받아서 사용하는 이유가 뭔가요?--->메모리 풀의 사용용도는 매번 디스크립터세트를 생성/해제하지 않고 재사용하여, 메모리 최적화를 극대화 하기 때문입니다.물론 재 사용하지 않고 " VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT " 비트를 사용하여 개별 해제도 가능합니다. @@@buffer와 memory에 대한 질문입니다. 예를 들면 device와 physicalDevice 처럼 buffer는 논리적인 개념이고 memory는 물리적인 개념인가요?--->물리적인 개념이 맞습니다. 메모리를 버퍼에 바인딩을 1회 하고 그 후로는 버퍼로만 컨트롤 하게 됩니다.cpu에서는 메모리를 할당하기 위해서 malloc을 사용하고 opengl 에서도 gralloc 을 들어보셨을 겁니다.opengl 에서는 메모리할당을 드라이버단에서 했지만,vulkan은 gpu 메모리 할당을 application 단에서 하도록 되어있고,결국 gpu 메모리 할당 후 gpu/cpu 공유하는 가상주소를 가져와서 write를 하는 방식이 되겠습니다. @@@pipelineLayout을 생성할 때 info 구조체에 setLayoutCount 값을 설정합니다.pipelineLayout으로 생성하는 graphics pipeline은 1개 이고, 그 graphics pipeline을 구성하는 vtx-frm shader에는 몇 개의 uniform을 사용하는지 이미 고정되어 있는데요.그러면 하나의 setLayoutCount만 사용하면 될 것 같은데, setLayoutCount를 따로 설정해주는 이유가 있나요?-->하나의 디스크립터 세트 레이아웃을 사용하고,셰이더에서 binding 변수만 맵핑 하여 사용해도 되지만, set 변수도 활용하여 같은 속성인 경우 묶을수가 있습니다.매터리얼의 속성이 여러개인 경우 같은 속성의 여러개의 디스크립터 세트를 만들어서 또 그 안에서 바인딩으로 할당 할수도 있습니다.아래 예제를 보시면, 돌의 재질을 만들때 여러개의 디스크립터 세트를 사용하는 예제가 있으니 참고하시면 되겠습니다.https://web.engr.oregonstate.edu/~mjb/vulkan/Handouts/DescriptorSets.1pp.pdf @@@descriptorSet은 이런 흐름으로 생성하고 사용하는 게 맞나요?- descriptorSetLayout으로 그래픽스 파이프라인에서 몇 개의 uniform이 사용될지 미리 알림---> count 뿐 아니라, 해당 리소스의 타입 용도등을 설정 해야 합니다.- descriptorPool로 descriptorSet을 사용 가능한 할당- descriptorSet을 writeDescriptorSet 으로 갱신해서 cpu->gpu로 데이터를 송부하는 용도로 사용하도록 설정 (readDescriptorSet는 검색해보니 없나보네요...ㅎㅎ)--> 생성한 디스크립터 세트와 생성한 버퍼를 연결해주신다고 생각하시면 됩니다..dstBinding 내부 변수의 값도 잘 확인하시면 되겠습니다.- 미리 uniform buffer를 업데이트 (render()의 1. 위치 정보 갱신)- vkCmdBindDescriptorSets() 을 호출하면 갱신된 위치 정보가 gpu에도 전송됨--> 커맨드 버퍼에 디스크립터 세트를 바인딩 합니다.위치 정보가 gpu에 전송된다는 의미도 맥락에서 맞지만, 바인딩이란 의미를 생각해보시면 좋을 것 같습니다. opengl 사용하실때도 버퍼나 이미지를 바인딩을 해야 사용 하실 수 있는 것과 비슷한 개념입니다.추가로 위 함수는 초기화 과정이 아니라, 렌더링 할 때 호출해야 됩니다.@@@
- 0
- 2
- 132
질문&답변
2024.07.27
섹션2-6 vulkan device 질문
안녕하세요 지나가다가 글을 남깁니다.1. 초기화 과정에서 물리 장치와 맵핑되는 Logical Device 미리 만들어 놓으면, 하드웨어 정보 없이도 생성해 놓은 logical device 통해 우리가 gpu의 명령을 내리기 쉽다는 의미인 것 같습니다.계속 보시면 아시겠지만 많은 Api 파라메터에 logical device 가 들어갑니다.c++ 클래스 인터페이스 추상화 의미와 동일 한것같네요큐라는 것은 CPU 에서 GPU로 가는 연결 통로라고 보시면 됩니다. 추후에 커맨드버퍼를 만들어서 명령어를 큐를 통해 전송을 합니다. 큐도 종류가 있는데, 그래픽 비트가 체크가 되어있는 큐는 렌더링을 하는 명령어를 GPU로 전송할 수 있는 큐입니다.삼각형 렌더링을 하기 위해 그래픽 비트가 마스킹된 큐를 사용하는 것입니다.
- 0
- 2
- 113
질문&답변
2024.07.05
windows에서 shaderc의 빌드 실패 문제 해결방법입니다
안녕하세요 vulkan 공부를 하시는 것 같은데요 ~워낙 하시는 분들이 잘 없기도 해서~ 아래 주소로 들어오셔서 같이 공부하면 좋을 것 같아요~https://open.kakao.com/o/g5MrTNog
- 2
- 3
- 194
스터디
모집중
2024.07.05 14:09
Vulkan( 불칸 ) 스터디 모집
- 0
- 0
- 209