MeshRenderer
MeshRenderer의 역할과 구조
MeshRenderer는 3D 게임 오브젝트를 렌더링하기 위한 핵심 컴포넌트입니다. Component 클래스를 상속받아 구현되었으며, 다음과 같은 주요 기능을 담당합니다:
3D 모델의 형태(Mesh)와 재질(Material) 정보 관리
렌더링 파이프라인 설정
렌더링 패스(RenderPass) 관리
Mesh 클래스
Mesh 클래스는 3D 객체의 형태 데이터를 저장하고 관리합니다.
주요 구성 요소
Geometry 클래스 - 정점 데이터 관리의 핵심
Geometry 클래스는 템플릿을 사용하여 다양한 정점 타입을 지원하는 유연한 구조로 설계되었습니다:
이 템플릿 구현의 핵심 특징:
타입 독립성: 템플릿 T를 통해 어떤 정점 구조체도 저장 가능
데이터 추가 방식:
단일 정점/인덱스 추가 (AddVertex, AddIndex)
벡터로 일괄 추가 (AddVertices, AddIndices)
전체 설정 (SetVertices, SetIndices)
벡터 기반 저장: 동적으로 크기가 변할 수 있는 메시 데이터 처리에 적합
다양한 정점 구조체 타입
Mesh 클래스에서는 Geometry 템플릿을 다양한 정점 타입으로 인스턴스화하여 사용합니다:
주요 정점 구조체 타입 및 용도:
Geometry를 활용한 메시 생성 과정
예를 들어, 구(Sphere) 메시를 생성하는 과정을 살펴보겠습니다:
이 과정에서 Geometry는:
구의 모든 정점과 인덱스 데이터를 저장
데이터를 Buffer 클래스에 전달하여 GPU 메모리에 업로드할 준비
Buffer 클래스 - GPU 메모리 관리의 핵심
버퍼 생성 매커니즘
가장 핵심적인 메서드인 CreateBuffer 템플릿 함수를 자세히 살펴보겠습니다:
CPU/GPU 메모리 접근 제어 시스템
Buffer 클래스에서 가장 중요한 특징 중 하나는 CPU와 GPU 간의 메모리 접근 권한을 세밀하게 제어하는 기능입니다:
D3D11_USAGE_IMMUTABLE (cpuWrite=false, gpuWrite=false):
생성 후 변경 불가능한 버퍼
CPU에서 초기화 후 GPU에서 읽기만 가능
D3D11_USAGE_DYNAMIC (cpuWrite=true, gpuWrite=false):
CPU에서 자주 업데이트하는 버퍼
GPU는 읽기만 가능
D3D11_USAGE_DEFAULT (cpuWrite=false, gpuWrite=true):
GPU에서 쓰기 가능
주로 GPU-GPU 복사 작업에 사용
D3D11_USAGE_STAGING (cpuWrite=true, gpuWrite=true):
CPU-GPU 간 데이터 전송에 사용
상수버퍼 관리
위 방식으로 생성된 상수 버퍼는 다음과 같은 데이터를 GPU에 전달하는데 사용됩니다:
변환 행렬 (월드, 뷰, 투영)
재질 속성 (ambient, diffuse, specular)
조명 데이터
애니메이션 키프레임 정보
카메라 정보
Material 클래스 - 텍스처와 셰이더 관리
Material 클래스는 3D 객체의 시각적 특성을 정의하고 관리하는 핵심 리소스입니다. 이 클래스는 객체가 빛을 어떻게 반사하고, 어떤 표면 질감을 가지며, 어떤 시각적 효과를 적용할지 결정합니다.
Material 클래스는 다음과 같은 핵심 요소들을 관리합니다:
셰이더 참조: 객체를 어떻게 렌더링할지 결정하는 셰이더 프로그램
텍스처 컬렉션: 객체의 표면 질감을 정의하는 다양한 텍스처 맵
재질 속성: 주변광(ambient), 확산광(diffuse), 반사광(specular) 등 재질의 광학적 특성
상수 버퍼: 이러한 속성을 셰이더에 전달하기 위한 버퍼
Material 클래스의 주요 메서드들:
Material 객체는 렌더링 과정에서 셰이더와 텍스처를 바인딩하고, 재질 속성을 상수 버퍼를 통해 GPU에 전달합니다. 이 과정에서 PushMaterialDesc() 메서드가 핵심 역할을 합니다:
Texture 클래스 - 시각적 이미지 데이터 관리
Material이 참조하는 Texture 클래스는 이미지 데이터를 로드하고 GPU에서 사용할 수 있는 형태로 관리합니다.
Texture 클래스의 주요 기능:
이미지 로딩: 다양한 형식(PNG, JPG, DDS 등)의 이미지 파일 로드
리소스 뷰 생성: 셰이더에서 접근할 수 있는 ShaderResourceView 생성
텍스처 속성 관리: 크기, 형식, 밉맵 레벨 등 설정
텍스처 로딩 과정의 예:
Material 클래스는 여러 Texture 객체를 참조하며, 각 텍스처는 다른 시각적 속성(base color, normal map, specular map 등)을 담당합니다. 이 텍스처들은 셰이더에 바인딩되어 최종 렌더링 결과에 영향을 줍니다.
Shader 클래스 - GPU 프로그래밍 인터페이스
Material이 참조하는 또 다른 핵심 구성요소인 Shader 클래스는 GPU에서 실행되는 프로그램을 관리합니다
Shader 클래스의 주요 기능:
셰이더 로딩 및 컴파일: HLSL 파일에서 셰이더 코드 로드 및 컴파일
DirectX 셰이더 객체 생성: 컴파일된 셰이더로 DirectX 셰이더 객체 생성
리소스 바인딩 관리: 상수 버퍼, 텍스처 등 리소스를 셰이더에 바인딩
셰이더 로딩과 컴파일 과정:
리소스 바인딩 메서드는 셰이더 슬롯을 사용하여 상수 버퍼나 텍스처를 셰이더의 특정 레지스터에 바인딩합니다:
Material 클래스는 Shader 객체를 설정하고 이를 통해 상수 버퍼와 텍스처를 셰이더에 바인딩합니다. 이 과정에서 셰이더 슬롯이 중요한 역할을 합니다.
ShaderSlot 클래스 - 셰이더 리소스 바인딩 관리
ShaderSlot 클래스는 셰이더 리소스(상수 버퍼, 텍스처 등)가 어떤 레지스터 슬롯에 바인딩될지 관리합니다.
셰이더 슬롯의 작동 방식:
셰이더 코드에서는 레지스터 바인딩을 통해 리소스에 접근합니다:
ShaderSlot 클래스는 이러한 리소스 이름(예: "TransformBuffer", "DiffuseMap")과 레지스터 슬롯(예: b0, t0)의 매핑을 관리합니다:
Shader 클래스의 리소스 바인딩 메서드는 ShaderSlot을 통해 이름으로 슬롯을 찾고 해당 슬롯에 리소스를 바인딩합니다:
RenderPass 클래스 - 렌더링 단계 관리
RenderPass 클래스는 특정 렌더링 기법이나 셰이더 효과를 구현하는 단일 렌더링 단계를 나타냅니다. MeshRenderer는 여러 RenderPass를 가질 수 있으며, 각 RenderPass는 다른 렌더링 기법을 적용합니다.
RenderPass의 주요 기능:
렌더링 상태 설정: 렌더링에 필요한 셰이더, 메시, 텍스처 등 설정 (MeshRenderer가 가지고 있는 데이터를사용)
렌더링 실행: 설정된 상태로 렌더링 수행
다양한 렌더링 기법 지원: 기본 렌더링, Terrain, Skybox, ParticleSystem 등 특수 렌더링 구현
기본 렌더링 과정 예시:
MeshRenderer 클래스는 여러 RenderPass를 관리하며, RenderManager는 이 RenderPass들을 적절한 순서로 실행합니다:
이러한 방식으로, Material은 셰이더, 텍스처, 상수 버퍼를 관리하고, Shader는 ShaderSlot을 통해 리소스를 바인딩하며, RenderPass는 이 모든 요소를 활용하여 실제 렌더링을 수행합니다. 이 구성 요소들의 조화로운 상호 작용이 3D 렌더링 시스템의 기반을 이룹니다.
렌더링 프로세스 전체 흐름
Material 초기화:
셰이더 설정
텍스처 설정
재질 속성 설정
상수 버퍼 생성 및 데이터 업로드
RenderPass 설정:
메시, 셰이더, 텍스처 참조 설정
렌더링 상태 구성
렌더링 실행:
RenderManager가 모든 렌더링 가능 오브젝트 수집
각 오브젝트의 모든 RenderPass 순차적으로 실행
각 RenderPass에서:
셰이더 설정
상수 버퍼 바인딩 (변환 행렬, 재질 속성)
텍스처 바인딩
정점 및 인덱스 버퍼 설정
그리기 호출
Last updated