MeshRenderer

MeshRenderer의 역할과 구조

MeshRenderer는 3D 게임 오브젝트를 렌더링하기 위한 핵심 컴포넌트입니다. Component 클래스를 상속받아 구현되었으며, 다음과 같은 주요 기능을 담당합니다:

  1. 3D 모델의 형태(Mesh)와 재질(Material) 정보 관리

  2. 렌더링 파이프라인 설정

  3. 렌더링 패스(RenderPass) 관리

Mesh 클래스

  • Mesh 클래스는 3D 객체의 형태 데이터를 저장하고 관리합니다.

    • 주요 구성 요소

Geometry 클래스 - 정점 데이터 관리의 핵심

  • Geometry 클래스는 템플릿을 사용하여 다양한 정점 타입을 지원하는 유연한 구조로 설계되었습니다:

  • 이 템플릿 구현의 핵심 특징:

  1. 타입 독립성: 템플릿 T를 통해 어떤 정점 구조체도 저장 가능

  2. 데이터 추가 방식:

    1. 단일 정점/인덱스 추가 (AddVertex, AddIndex)

    2. 벡터로 일괄 추가 (AddVertices, AddIndices)

    3. 전체 설정 (SetVertices, SetIndices)

  3. 벡터 기반 저장: 동적으로 크기가 변할 수 있는 메시 데이터 처리에 적합

  • 다양한 정점 구조체 타입

    • Mesh 클래스에서는 Geometry 템플릿을 다양한 정점 타입으로 인스턴스화하여 사용합니다:

  • 주요 정점 구조체 타입 및 용도:

  • Geometry를 활용한 메시 생성 과정

    • 예를 들어, 구(Sphere) 메시를 생성하는 과정을 살펴보겠습니다:

이 과정에서 Geometry는:

  1. 구의 모든 정점과 인덱스 데이터를 저장

  2. 데이터를 Buffer 클래스에 전달하여 GPU 메모리에 업로드할 준비

Buffer 클래스 - GPU 메모리 관리의 핵심

  • Buffer 클래스 구조와 역할

    • Buffer 클래스는 CPU 메모리의 데이터를 GPU 메모리로 전송하고 관리하는 역할을 담당합니다:

  • 버퍼 생성 매커니즘

    • 가장 핵심적인 메서드인 CreateBuffer 템플릿 함수를 자세히 살펴보겠습니다:

  • CPU/GPU 메모리 접근 제어 시스템

    • Buffer 클래스에서 가장 중요한 특징 중 하나는 CPU와 GPU 간의 메모리 접근 권한을 세밀하게 제어하는 기능입니다:

      • D3D11_USAGE_IMMUTABLE (cpuWrite=false, gpuWrite=false):

        1. 생성 후 변경 불가능한 버퍼

        2. CPU에서 초기화 후 GPU에서 읽기만 가능

      • D3D11_USAGE_DYNAMIC (cpuWrite=true, gpuWrite=false):

        1. CPU에서 자주 업데이트하는 버퍼

        2. GPU는 읽기만 가능

      • D3D11_USAGE_DEFAULT (cpuWrite=false, gpuWrite=true):

        1. GPU에서 쓰기 가능

        2. 주로 GPU-GPU 복사 작업에 사용

      • D3D11_USAGE_STAGING (cpuWrite=true, gpuWrite=true):

        1. CPU-GPU 간 데이터 전송에 사용

  • 상수버퍼 관리

위 방식으로 생성된 상수 버퍼는 다음과 같은 데이터를 GPU에 전달하는데 사용됩니다:

  • 변환 행렬 (월드, 뷰, 투영)

  • 재질 속성 (ambient, diffuse, specular)

  • 조명 데이터

  • 애니메이션 키프레임 정보

  • 카메라 정보

Material 클래스 - 텍스처와 셰이더 관리

  • Material 클래스는 3D 객체의 시각적 특성을 정의하고 관리하는 핵심 리소스입니다. 이 클래스는 객체가 빛을 어떻게 반사하고, 어떤 표면 질감을 가지며, 어떤 시각적 효과를 적용할지 결정합니다.

Material 클래스는 다음과 같은 핵심 요소들을 관리합니다:

  1. 셰이더 참조: 객체를 어떻게 렌더링할지 결정하는 셰이더 프로그램

  2. 텍스처 컬렉션: 객체의 표면 질감을 정의하는 다양한 텍스처 맵

  3. 재질 속성: 주변광(ambient), 확산광(diffuse), 반사광(specular) 등 재질의 광학적 특성

  4. 상수 버퍼: 이러한 속성을 셰이더에 전달하기 위한 버퍼

  • Material 클래스의 주요 메서드들:

Material 객체는 렌더링 과정에서 셰이더와 텍스처를 바인딩하고, 재질 속성을 상수 버퍼를 통해 GPU에 전달합니다. 이 과정에서 PushMaterialDesc() 메서드가 핵심 역할을 합니다:

Texture 클래스 - 시각적 이미지 데이터 관리

  • Material이 참조하는 Texture 클래스는 이미지 데이터를 로드하고 GPU에서 사용할 수 있는 형태로 관리합니다.

Texture 클래스의 주요 기능:

  1. 이미지 로딩: 다양한 형식(PNG, JPG, DDS 등)의 이미지 파일 로드

  2. 리소스 뷰 생성: 셰이더에서 접근할 수 있는 ShaderResourceView 생성

  3. 텍스처 속성 관리: 크기, 형식, 밉맵 레벨 등 설정

  • 텍스처 로딩 과정의 예:

Material 클래스는 여러 Texture 객체를 참조하며, 각 텍스처는 다른 시각적 속성(base color, normal map, specular map 등)을 담당합니다. 이 텍스처들은 셰이더에 바인딩되어 최종 렌더링 결과에 영향을 줍니다.

Shader 클래스 - GPU 프로그래밍 인터페이스

  • Material이 참조하는 또 다른 핵심 구성요소인 Shader 클래스는 GPU에서 실행되는 프로그램을 관리합니다

Shader 클래스의 주요 기능:

  1. 셰이더 로딩 및 컴파일: HLSL 파일에서 셰이더 코드 로드 및 컴파일

  2. DirectX 셰이더 객체 생성: 컴파일된 셰이더로 DirectX 셰이더 객체 생성

  3. 리소스 바인딩 관리: 상수 버퍼, 텍스처 등 리소스를 셰이더에 바인딩

  • 셰이더 로딩과 컴파일 과정:

리소스 바인딩 메서드는 셰이더 슬롯을 사용하여 상수 버퍼나 텍스처를 셰이더의 특정 레지스터에 바인딩합니다:

Material 클래스는 Shader 객체를 설정하고 이를 통해 상수 버퍼와 텍스처를 셰이더에 바인딩합니다. 이 과정에서 셰이더 슬롯이 중요한 역할을 합니다.

ShaderSlot 클래스 - 셰이더 리소스 바인딩 관리

  • ShaderSlot 클래스는 셰이더 리소스(상수 버퍼, 텍스처 등)가 어떤 레지스터 슬롯에 바인딩될지 관리합니다.

  • 셰이더 슬롯의 작동 방식:

  1. 셰이더 코드에서는 레지스터 바인딩을 통해 리소스에 접근합니다:

  1. ShaderSlot 클래스는 이러한 리소스 이름(예: "TransformBuffer", "DiffuseMap")과 레지스터 슬롯(예: b0, t0)의 매핑을 관리합니다:

  1. Shader 클래스의 리소스 바인딩 메서드는 ShaderSlot을 통해 이름으로 슬롯을 찾고 해당 슬롯에 리소스를 바인딩합니다:

RenderPass 클래스 - 렌더링 단계 관리

  • RenderPass 클래스는 특정 렌더링 기법이나 셰이더 효과를 구현하는 단일 렌더링 단계를 나타냅니다. MeshRenderer는 여러 RenderPass를 가질 수 있으며, 각 RenderPass는 다른 렌더링 기법을 적용합니다.

RenderPass의 주요 기능:

  1. 렌더링 상태 설정: 렌더링에 필요한 셰이더, 메시, 텍스처 등 설정 (MeshRenderer가 가지고 있는 데이터를사용)

  2. 렌더링 실행: 설정된 상태로 렌더링 수행

  3. 다양한 렌더링 기법 지원: 기본 렌더링, Terrain, Skybox, ParticleSystem 등 특수 렌더링 구현

  • 기본 렌더링 과정 예시:

  • MeshRenderer 클래스는 여러 RenderPass를 관리하며, RenderManager는 이 RenderPass들을 적절한 순서로 실행합니다:

이러한 방식으로, Material은 셰이더, 텍스처, 상수 버퍼를 관리하고, Shader는 ShaderSlot을 통해 리소스를 바인딩하며, RenderPass는 이 모든 요소를 활용하여 실제 렌더링을 수행합니다. 이 구성 요소들의 조화로운 상호 작용이 3D 렌더링 시스템의 기반을 이룹니다.

렌더링 프로세스 전체 흐름

  1. Material 초기화:

    1. 셰이더 설정

    2. 텍스처 설정

    3. 재질 속성 설정

    4. 상수 버퍼 생성 및 데이터 업로드

  2. RenderPass 설정:

    1. 메시, 셰이더, 텍스처 참조 설정

    2. 렌더링 상태 구성

  3. 렌더링 실행:

    1. RenderManager가 모든 렌더링 가능 오브젝트 수집

    2. 각 오브젝트의 모든 RenderPass 순차적으로 실행

    3. 각 RenderPass에서:

      1. 셰이더 설정

      2. 상수 버퍼 바인딩 (변환 행렬, 재질 속성)

      3. 텍스처 바인딩

      4. 정점 및 인덱스 버퍼 설정

      5. 그리기 호출

Last updated