수업


주제

  • DirectX11 기반 게임 프로젝트 초기 구조 및 설정 방식
  • Client(실행 담당)와 Engine(재사용 라이브러리) 구조 분리
  • 외부 라이브러리 경로 구성(Include/Lib)
  • .fx 기반 셰이더 시스템 도입 및 technique/pass를 활용한 렌더링 방식 정립

개념

이 강의는 C++/DirectX11 기반 게임 프로젝트에서 다음과 같은 요소들을 다룬다:

  1. 정적 라이브러리(Static Library) 를 활용한 Engine-Client 분리 구조
  2. 폴더 구조 통일화를 통해 Include/Lib 구분 및 관리
  3. Visual Studio 프로젝트 설정 (속성 페이지) 을 통해 헤더, 라이브러리 경로 포함
  4. 셰이더 코드(.fx)에서 technique/pass 구조를 활용한 렌더링 통합
  5. IExecute 구조 + GameDesc 구조로 진입점 및 실행 단위 통합 관리

용어정리

용어설명
Static Library (.lib)정적 링크되는 코드 라이브러리. Engine은 .lib로 빌드됨
Engine공통 기능(렌더링, 입력 등)을 담당하는 정적 라이브러리 프로젝트
Client실행 책임을 지는 프로젝트. Engine을 참조함
Output Directory.lib/.exe 결과물이 출력되는 경로 설정
Intermediate Directory.obj 등 임시 산출물이 저장되는 경로 설정
Additional Include Directories헤더를 탐색할 경로를 지정하는 속성 값
Additional Library Directories링커가 .lib 파일을 찾는 경로 지정
Pre-Build Event빌드 전에 자동 실행되는 명령 (ex. xcopy)
FX11Microsoft의 Effect Framework for DirectX11
technique / passFX11에서 쉐이더 흐름을 정의하는 단위 구조
xcopy /Y덮어쓰기를 포함한 파일 복사 명령
IExecute실행 단위 클래스. Client에서 어떤 기능을 실행할지 위임받음

코드 분석 및 설정 설명

1. Visual Studio 프로젝트 설정 (Engine 기준)

  • Configuration Type: Static Library (.lib)
  • Output Directory: $(SolutionDir)Libraries\Lib\Engine\
  • Intermediate Directory: $(SolutionDir)Intermediate\$(Configuration)\
  • C/C++ > General > Additional Include Directories: $(SolutionDir)Libraries\Include\;%(AdditionalIncludeDirectories)
  • Librarian > General > Additional Library Directories: $(SolutionDir)Libraries\Lib\;%(AdditionalLibraryDirectories)
  • Build Events > Pre-Build:
xcopy /Y "$(SolutionDir)Engine\*.h" "$(SolutionDir)Libraries\Include\Engine"
xcopy /Y "$(SolutionDir)Engine\*.inl" "$(SolutionDir)Libraries\Include\Engine"

2. Client 프로젝트 설정

  • 동일하게 Output/Intermediate Directory 설정
  • C/C++ > Additional Include Directories 설정 동일
  • Linker > Additional Library Directories 설정 동일
  • Precompiled Header 사용 설정: pch.cpp는 Create (/Yc), 나머지 파일은 Use (/Yu)
// pch.h 내부
#pragma once
#pragma comment(lib, "Engine/Engine.lib")
#include "Engine/EnginePch.h"

폴더 구조 분석

GameCoding2/
├── Binaries/               # 실행파일
├── Intermediate/           # 빌드 중간파일
├── Libraries/
│   ├── Include/
│   │   ├── DirectXTex/
│   │   ├── FX11/
│   │   └── Engine/         # 헤더 복사 대상
│   └── Lib/
│       ├── DirectXTex/     # DirectXTex.lib 등
│       ├── FX11/
│       └── Engine/         # Engine.lib 출력 경로
├── Shaders/                # .hlsl, .fx 파일
├── Resources/              # 텍스처, 폰트, 사운드
├── Client/                 # 실행 프로젝트
├── Engine/                 # 정적 라이브러리 프로젝트
└── GameCoding2.sln         # 솔루션 파일

Shader 구조 및 셰이더 설정 (.fx)

struct VertexInput {
    float4 position : POSITION;
};

struct VertexOutput {
    float4 position : SV_POSITION;
};

VertexOutput VS(VertexInput input)
{
    VertexOutput output;
    output.position = input.position;
    return output;
}

float4 PS(VertexOutput input) : SV_TARGET { return float4(1, 0, 0, 1); } // 빨강
float4 PS2(VertexOutput input) : SV_TARGET { return float4(0, 1, 0, 1); } // 초록
float4 PS3(VertexOutput input) : SV_TARGET { return float4(0, 0, 1, 1); } // 파랑

technique11 T0 {
    pass P0 { SetVertexShader(CompileShader(vs_5_0, VS())); SetPixelShader(CompileShader(ps_5_0, PS())); }
    pass P1 { SetVertexShader(CompileShader(vs_5_0, VS())); SetPixelShader(CompileShader(ps_5_0, PS2())); }
}

technique11 T1 {
    pass P0 { SetVertexShader(CompileShader(vs_5_0, VS())); SetPixelShader(CompileShader(ps_5_0, PS3())); }
}
  • HLSL Compiler 설정:
    • Shader Type: Effect (/fx)
    • Shader Model: Shader Model 5.0
    • Entry Point: 삭제함 (자동 인식)

TriangleDemo 클래스

class TriangleDemo : public IExecute
{
public:
    void Init() override;
    void Update() override;
    void Render() override;

private:
    shared_ptr<Shader> _shader;
    vector<VertexData> _vertices;
    shared_ptr<VertexBuffer> _buffer;
};
void TriangleDemo::Init()
{
    _shader = make_shared<Shader>(L"01. Triangle.fx");

    _vertices.resize(3);
    _vertices[0].position = Vec3(-0.5f, 0.f, 0.f);
    _vertices[1].position = Vec3(0.f, 0.5f, 0.f);
    _vertices[2].position = Vec3(0.5f, 0.f, 0.f);

    _buffer = make_shared<VertexBuffer>();
    _buffer->Create(_vertices);
}

void TriangleDemo::Render()
{
    uint32 stride = _buffer->GetStride();
    uint32 offset = _buffer->GetOffset();
    DC->IASetVertexBuffers(0, 1, _buffer->GetComPtr().GetAddressOf(), &stride, &offset);
    _shader->Draw(0, 0, 3); // technique 0, pass 0
}

핵심

  1. 모듈화 구조: Client와 Engine을 분리하고 Engine은 .lib로 관리
  2. 경로 세팅: Include/Lib 폴더를 설정하여 외부 종속성과 헤더를 정리
  3. .fx 시스템 도입: Vertex/Pixel Shader를 묶고 technique/pass로 관리하는 구조
  4. IExecute 기반 구조 확립: 실행 단위를 객체화하여 실행 로직 유연화
  5. 헤더 자동 복사: Pre-Build 이벤트로 엔진 헤더 자동 배포 가능
  6. 필터 기반 코드 정리: 논리적 폴더 구성으로 관리 효율 증대
  7. 셰이더 확장 용이: Shader 구조를 확장하고 재사용 가능한 시스템 기반 정립

profile
李家네_공부방

0개의 댓글