[개발일지] ITextAsset, IBinaryAsset, Shader Compile
어셈블리어

Lv.1 어셈블리어 (121.♡.94.55)

2025년 12월 11일 PM 04:06 · 수정됨(12. 12. 09:08)

조회 366 공감 0


- 첫밴째 애셋으로 ITextAsset를 제작 했습니다. 접두어 'I'를 보시면 아시겠지만 인터페이스형 클래스 입니다.

- Mark3D부터는 완벽히 분리된 dll 또는 모듈로써.. 완전한 COM객체는 아니지만 COM이랑 최대한 비슷한 구조로 작성 할 예정입니다.

- ITextAsset은 주로 인코딩 관련된 메소드들이 포함되어 있습니다. 윈도우의 경우 기본 인코딩이 CP939지만 Unix계열은 UTF8계열입니다.

- 또한 wchar의 사이즈가 윈도우의 경우 UTF16으로 2바이트이며 Unix계열은 대체적으로 UTF32 4바이트를 사용 합니다.

- JSON 또는 개발용 스트링 테이블 등에서 주로 사용 될듯 합니다.

- 동기, 비동기 로드 모두 구현 했습니다.


------------------------------------------------------------------------------

- IBinaryAsset은 대부분의 애셋 로드(텍스쳐, 모델, 등등)에서 사용될 클래스 입니다.

- 사실 ITextAsset과 IBinaryAsset은 UTF8이상의 유니코드 입장에서는 큰 차이는 없습니다.

- 널포인터 종료 유무의 차이밖에 없다고 보면 됩니다.

- 다만 IBinaryAsset은 유니코드 관련 메소드가 없고 CRC32, CRC64와 같은 해시값을 얻어오는데 집중 되어있습니다.



------------------------------------------------------------------------------

- Direct3D 11의 쉐이더 컴파일 부분 코드 입니다.

- 컴파일후 Reflect기능을 이용해서 쉐이더의 상수구조체, 샘플러 스테이트, 버텍스 구조, 렌더 상태를 얻어 오거나 세팅합니다.

- 언리얼이나 유니티의 경우 컴파일후 Refelct 기능을 이용해서 일종의 메타데이터를 구성 합니다. 하지만 저는 그냥 매번 컴파일해서 Reflect를 돌릴 예정입니다. 무거운 게임을 만들일이 없기 때문에 추후 이부분은 최적화 하는 과제로 남겨둡니다. 

- 사실 쉐이더 구조를 작성하는 것이 가장 어려운 고민 이었습니다. D3D9까지만 해도 쉐이더는 일종의 '리소스'로써 취급하며 사용 했는데요.

- D3D11 부터는 사실상 쉐이더는 리소스가 아니라 렌더링 파이프라인을 전담하는 프로그램으로써 진화한 느낌입니다. 그래서 완전히 리소스마냥 컨트롤 하기가 좀 힘듭니다.

- 예를 들어 inputLayout은 버텍스 쉐이더를 컴파일 해야만 생성 할수 있어서 VertexDeclaration과는 다른 방식으로 관리 해야 합니다.

- 각 RenderState역시 동적으로 변경 되었던 과거와 달리 완전한 객체로써 생성해야 됩니다. 그래서 동적 변경이 까다롭습니다.

- 아무튼 이제는 D3D 코드를 작성하기 되어 곧 폴리곤 하나 렌더링 할 수 있겠네요.



------------------------------------------------------------------------------

- mark3d는 COM구조와 비슷하게 작성하게 되면서 외부에는 오직 1개의 Factory 함수만 익스포트 합니다. (BOOL CreateEngineFactory(xxxx, IMark3D** ppOut) 이런식으로요.

- 해당 Factory로 얻게되는 IMark3D라는 인터페이스에서 나머지 ITextAsset, IBinaryAsset, ITexture2D..등등의 리소스 등등을 할당 받을수 있게 됩니다.

- 대부분 COM구조의 dll이 그렇듯 저도 헤더 파일에는 오직 인터페이스만 노출합니다.

- 스마트 포인터가 아닌 IUnknown의 AddRef와 Release를 통해서 참조 카운트를 AddRef하거나 Release해서 삭제여부가 갈립니다.

- 최근 C++11이후 부터는 shared_ptr이나 unique_ptr을 통해서 스마트 포인터로 관리 하는데 직접 사용하기를 좋아하는 저로써는 고민입니다.

- 최근 D3D12 SDK의 샘플을 보면 COM객체용인 ComPtr이 존재 합니다. shared_ptr과 거의 같은 기능을 담당하는데 일단 제외하고 작성 할 예정입니다.

- 추후 클라이언트용 유틸리티 기능에 추가할 생각입니다.

- 아무튼 슬슬 렌더러 제작을 향해 갑니다.

댓글 (2)

  • 코끼리대파

    코끼리대파 Lv.1

    25.12.12 · 61.♡.36.99

    저는 윈도우 게임쪽은 모르고 메가여치님의 개발방송 가끔듣는데요
    고수분들은 스마트포인터 이런거 안쓰고 포인터 직접관리하시는거 같아요
  • 비쥬얼씨뿔뿔

    비쥬얼씨뿔뿔 Lv.1 → 코끼리대파 작성자

    25.12.12 · 175.♡.10.44

    오 영천님 방송 저도 듣는데.. 사석에선 이름부르는 사이라 ㅋㅋㅋ 반갑네요!

댓글을 작성하려면 이 필요합니다.