EHRenderer는 DirectX 11 API를 기반으로, 쉐이더 리플렉션(Shader Reflection) 기술을 활용하여 머티리얼 시스템과 데이터 바인딩을 자동화한 렌더링 엔진입니다. 복잡한 상수 버퍼(Constant Buffer) 정렬 규칙을 자동 계산하여 개발 편의성을 극대화하고, 성능 최적화를 위한 리소스 공유 구조를 채택했습니다.
🚀 핵심 렌더링 기술
- Shader Reflection 기반 자동 바인딩 시스템
ID3D11ShaderReflection을 활용하여 쉐이더의 상수 버퍼 구조, 변수 이름, 오프셋(Offset) 및 크기를 런타임에 파싱- HLSL의 복잡한 패딩(Padding) 및 정렬 규칙(16바이트 경계)을 수동 계산 없이 자동으로 처리
- Flyweight 패턴 기반 쉐이더 공유 구조
- 동일한 쉐이더 바이너리를 사용하는 객체들이 하나의 쉐이더 인스턴스를 공유하여 메모리 점유율 최적화
- 쉐이더는 데이터 전송의 ‘통로(Slot)’ 역할만 수행하고, 실제 상태 값은 각 머티리얼이 독립적으로 소유
🎨 머티리얼 시스템 (EHRenderer.Material)
- Data-Driven 머티리얼 아키텍처
- JSON 형식을 통해 쉐이더 속성(Properties)과 텍스처를 정의하고 관리
- 머티리얼 초기화 시 쉐이더의 레이아웃을 본떠 자신만의 전용 데이터 블록(Blob)을 생성
- 부분적 속성 업데이트 및 초기화 로직
- 머티리얼 설정에 포함되지 않은 쉐이더 변수는 자동으로
0또는 기본값으로 초기화 D3D11_MAP_WRITE_DISCARD를 활용한 매치(Batch) 단위 상수 버퍼 업데이트로 안정적인 상태 전이 보장
- 머티리얼 설정에 포함되지 않은 쉐이더 변수는 자동으로
🛠️ DX11Shader 유틸리티
- 동적 파이프라인 제어
- 정점(VS), 픽셀(PS) 쉐이더의 상수 버퍼 슬롯을 자동으로 추적하고 바인딩 인덱스를 매칭
- 입력 레이아웃(Input Layout) 자동 생성: 쉐이더 시그니처 분석을 통해 정점 데이터 형식 결정
- 상수 버퍼 슬롯 관리
- 쉐이더 내
cbuffer단위의 슬롯 인덱스와 이름을 맵핑하여 문자열 기반의 직관적인 데이터 접근 지원 SetSlot,ResetSlot인터페이스를 통한 명시적 메모리 갱신 제어
- 쉐이더 내
📌 정리
- 자동화: 쉐이더 코드 변경 시 C++ 코드를 수정할 필요 없이 리플렉션을 통해 속성 정보를 자동 갱신
- 유연성: 다양한 쉐이더 타입에 대응 가능한 제네릭 머티리얼 시스템 구축
- 최적화: 중복된 쉐이더 리소스 로드를 방지하고 버퍼 업데이트 비용을 최소화하는 구조 설계