개발 노트 vulkan record command buffer 2019/05/15 01:53 by cagetu

vulkan renderpass에 맞춰서 이제 어느 정도 흐름을 잡아 가능 중...

TODO
  • 이미지 레이아웃 학습 및 정리
  • CommandBuffer Fence 학습 및 정리
  • RenderPass Dependency 학습 및 정리
  • RenderGraph (RenderPipeline, FrameGraph) 연구 및 구현
  • RenderPass 및 FrameBuffer 관리 처리
  • CommandBuffer 레코딩 학습 및 처리
  • 전체 렌더링 정의를 해보자!!! 
이 모든 것이 백버퍼 생성/설정, Swap 버퍼 처리 등 기반 작업일 뿐이라니... 이전 api는 드라이버가 정말 많은 일을 해주었구나...  

개발 노트 vulkan renderpass 2019/05/07 07:29 by cagetu

크로스 플랫폼 엔진 랑 맞는 내용은 아니지만, renderpass를 구성하다보니 결국 renderpipeline 을 어떻게 구성하는지에 대한 내용과 동일하게 적용되는 듯 하다. 이전에 만들어봤던 RenderPipeline 내용하다고 사실 비슷하다.

단, Vulkan에서는 RenderPass가 사실 하나의 Frame에 대한 전체 패스에 대한 정의하고 SubPass를 하나의 렌더 타겟을 기반하는 렌더 패스로 해야 RenderTarget 전환 비용이 줄어들어서 성능이 올라가는 듯 하다. 

한 패스의 구성은 대충 이런 듯 하다.

FrameBuffer
  • CommandBuffer
  • RenderPass
    • SubPass
      • RenderTarget
        • Channel
        • Channel
        • Channel
      • Draw
        • Record CommandBuffer
    • SubPass
    • RenderTarget
    • Draw
      • NextSubPass
      • Record CommandBuffer
    • SubPass
      • RenderTarget
      • Draw
        • NextSubPass
        • Record CommandBuffer

SubPass 의존성, 타겟 이미지에 대한 Attachment 설정 및 순서 등... 생각할게 참 많다. 따라가보면 결국 Frame 구성을 어떻게 하느냐? 에 대한 문제가 된다.

삼각형도 못 그렸는데, 생각할게 많아졌다. ;;;;

Basketball Diary ThankU. Dirk 2019/04/19 18:02 by cagetu

가장 닮고 싶었던 농구 선수! 고마웠어요! 




미분류 MetalAPI 2019/04/16 11:41 by cagetu

Vulkan 해보다가 Metal을 아이폰에서 성능이 매우 잘 나와서 궁금한 마음에 "맥북에어"를 중고로 구입했음! 뙇!

사실 맥OS가 굉장히 낯설기도 하고, xcode를 많이 사용해보지 않아서 어색하다.

메탈을 언리얼 등에서 일반적으로 "mtlpp - C++ wrapper around Metal"(https://github.com/crezefire/unreal-mtlpp)를 이용해서 C++로 매핑해서 사용하는 듯 하다.

나도 이 라이브러리를 적극 사용해볼 생각이다. (메탈을 직접 건드리는 것은 아니지만... 검증?! 된 방법으로..)

실제로 얼마나 붙여볼지는 모르지만, 기기를 샀으니까 뭐라도 해보자!! 따아!!!

그 전에 xcode용 프로젝트 생성하는 것부터가 고난이다.. ㅠㅠ


개발 노트 vulkan 병렬 렌더링 고민 2019/04/09 02:35 by cagetu

Vulkan 작업해보면서, CommandPool > CommandBuffer, Queue를 어떻게 구분해서 병렬 렌더링 쓰레드를 구성해야 하나? 라는 주제에 관심도 많이 가고, 고민도 많이 된다.

일단 찾아본 내용으로 정리하면, 대략 아래와 같다.
  • CommandPool은 쓰레드 당 하나씩 생성하도록 한다. 그리고, CommandPool에서 생성된 CommandBuffer도 동일한 쓰레드에서 사용한다. (동기화 비용을 최대한 줄이기 위해)
  • CommandBuffer에 레코딩 하는 쓰레드와 Queue에 서밋하는 쓰레드는 다를 수 있다.
  • 단일 쓰레드라고 하더라도, CommandBuffer를 Frame 단위로 레코딩해서 처리한다.
  • Frame 단위로 나누는 것도 방법이다. 
위의 내용을 기반으로 대충 아래와 같은 그림으로 설계를 해보았다.
  • RenderAgent(Thread) 마다 CommandPool or Queue를 가질 수 있다.
  • RenderAgent 내부에서는 다수의 CommandBuffer를 생성해서 사용할 수 있다.
  • Queue에 서밋하는 것은 다른 Thread에서 진행될 수 있다. (이러면 동기화 필요)
  • 각 Thread 사이에는 메시지(RenderCommand)를 통해서 통신한다. 

멀티 쓰레드 렌더링을 해본 경험이 적어서 부족하지만 일단 이 방향으로 진행해보자!!!

p.s) 여러 의견을 들어보니 단일 쓰레드로 하는 것이 더 나은 성능을 발휘한다고 한다. 즉, 단일 쓰레드에 프레임 단위로 레코딩해서 기다리는 시간 없도록 운영한다면 충푼히 성능 상의 이득을 얻을 수 있다는 것이다. (이건 한번 해봐야 할 듯 하다. 결국 테스트를 위해서 스케일 아웃 될 수 있도록 구현되어야 한다!)


1 2 3 4 5 6 7 8 9 10 다음



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu