비쥬얼씨뿔뿔 (180.♡.243.82)
2026년 1월 31일 AM 02:11

- 회사 일 때문에 거의 작업을 못하고 있다가.. 오늘 집안일로 휴가를 써서 아주아주 기초적이고 단순한 렌더러를 만들었습니다.
- IPrimitiveBuffer와 ISurfaceMaterial 두 객체를 이용해서 표면 재질과 렌더 상태값들 그리고 프리미티브(도형)의 정보를 담은 버퍼 데이터들을 이용해서 카메라 시점을 세팅하고 DrawCommand로 넘겨주는 코드를 작성했습니다.
- 1개의 도형 렌더링을 위해서 DrawCommand를 생성하고 나면 현재 프레임의 렌더큐에 넣어줍니다.

- 아직 투명,불투명 분리는 없지만 Command의 값을 이용해서 소팅하는 기능 까지는 만들었습니다.
- 불투명 객체는 앞에서 부터 뒤로 그려야 하고.. 투명한 객체(이펙트같은..)들은 뒤에서 앞으로 그려야 합니다. 그러한 소트 기능은 기본적으로 넣었습니다. (Depth값 설정)
- 상태값 변경의 경우 API호출 비용이 꽤 나가는 경우가 있습니다. (블렌드상태, 쉐이더 변경, 텍스쳐 변경..등등)
- 최신 하드웨어의 경우 일반적으로 쉐이더 변경이 가장 비싸고 그다음이 텍스쳐 그다음이 각각 렌더 상태값 변경이 비쌉니다.
- 이걸 64비트 unsigned int값에 비트를 쪼개서 값을 채워 넣습니다. 여기서 만약 1 << 60 이런식으로 직접 비트 값을 밀어 넣을 경우에는 엔디안 상관없이 작업이 가능 하겠지만 해당 코드는 대입 세팅할 예정입니다.
- LINK_NODE가 존재하는 이유는 해당 COMMAND를 Object Pool에서 미리 할당 하여 사용할 예정이기 때문에 STL의 list나 deque를 사용 할 경우 내부적으로 Node할당이 빈번히 일어나기 때문에 C로 작성된 전용 linked_list로 관리 하기 위해서 노드를 미리 가지고 있습니다.
- RenderQueue에서는 직접 개발한 TArray라는 템플릿 라이브러리를 사용 합니다.
- 텍스쳐나 쉐이더, 렌더 스테이트의 ID값은 미리 생성하는 것이 아닌 드로우 하는 순서대로 캐싱해서 프레임마다 새로 생성합니다. 동적 할당을 아예 막기 위해서 이전에 설명한 Marker기반의 StackPool 할당자를 사용합니다.

- D3D11RenderCommandExecutor라는 코드에서 최종적으로 모아 놓은 DrawCommand들을 렌더링 합니다. 아직은 Forwrad기반의 렌더링의 기본적인 커맨더 실행만 의식적으로 쭈우욱 길게 늘여트려 코딩해놨습니다.
- 추후에는 투명, 불투명 구분과 약간의 코드 단순화와 공통 코드 함수화 등등의 작업이 필요하겠지만 그건 하나씩 기능을 만들면서 추가 하거나 리팩토링 또는 아예 구조 변경할 예정입니다.
- 추후 캐릭터 렌더링, 이펙트(파티클) 렌더링, UI렌더링 등의 기능 개발이 마무리 되면 디퍼드(Deffered) 렌더러가 추가 될 예정입니다. 그러면 사실상 무제한 라이팅 기능이나 여러가지 고급 렌더링 기법들을 추가 할 수 있을 것 같습니다.

- 솔직히 말씀드리면 처음에 코드 다 작성하고도 삼각형이 전혀 렌더링 되지 않았습니다.
- 처음에는 뷰포트, 프로젝션 행렬 계산에 실수가 있었고, 또 하나는 렌더링 상태값 세팅에 문제가 있었습니다.
- 마지막으로 SampleMask를 바보같이 0으로 세팅 해서 픽셀 쉐이더 단계가 아예 실행이 되지 않아서 렌더링이 안되고 있었습니다.
- 이 모든 문제를 비쥬얼 스튜디오에 탑재된 GPU디버깅 기능을 통해서 해결 할 수 있었습니다.
- 제가 MS의 비쥬얼 스튜디오가 가장 완벽한 개발 도구라고 생각하는 부분도 이러한 부분입니다. 상세한 GPU디버깅이 가능하게 만들어놔서 정말 편하게 디버깅 할 수 있었습니다.
- 옛날 처럼 Pix니 RenderDoc이니 세팅 할 이유가 거의 줄었습니다.
- 쉐이더에 브레이크 포인트를 세팅 후 라인 별 디버깅 까지 지원합니다.
결론
- 아무튼 망할 놈의 SampleMask를 0으로 세팅하는 실수로 정말 개삽질(!) 하다가 겨우 삼각형 렌더링에 성공했습니다.
- 이제 삼각형 렌더링을 성공 했으니 또 한번 전체 코드를 살펴보고 리팩토링 및 코드 정리 등등을 작업 예정입니다.
- 최적화가 필요한 부분은 최적화도 하고요.. 현 단계에서는 동적 할당을 게임루프 실행 중에 없애자! 이것이 목표 입니다.
감사합니다
댓글 (0)
- 아직 댓글이 없습니다. 첫 댓글을 작성해보세요!
댓글을 작성하려면 이 필요합니다.