루리코딩 세상

DirectX에 관하여 기본적인 지식 뼈대 만들기 본문

이론/DirectX

DirectX에 관하여 기본적인 지식 뼈대 만들기

루리딩 2025. 5. 29. 13:10

Direct3D 11은 Window 플랫폼에서 현세대 그래픽 하드웨어를 활용하는 고성능 3차원 그래픽 응용 프로그램을 작성하기 위한 하나의 렌더링 라이브러리다. 즉 Direct3D는 API(application programming interface, 응용프로그래밍 인터페이스)가 자신이 제어하는 바탕 그래픽 하드웨어를 밀접하게 본뜬 것이라는 의미인 라이브러리다. 이를 게임 업계에서 쓰이는데, 게임용 고수준 렌더링엔진을 구축할 때 Direct3D를 기반으로 삼는다. 하지만 3D의 활용성은 게임 뿐만 아니라, 의학, 과학, 시각화와 건물 내부 시연 등에도 그런 그래픽이 필요하다. 현세대의 고성능의 그래픽 카드를 장착하고 출시되는 PC들에서는 3차원 응용 프로그램이 아닌 프로그램에서도 GPU(graphics processing unit, 그래픽 처리 장치)의 장점을 활용해서 대량의 계산 작업을 그래픽 카드에게 맡기는 방식이 점차 대중화되고 있다. 이러한 개념을


범용 GPU 계산 (general purpose GPU computing, GPGPU computing)이라 부른다.

Direct3D 11은 범용 GPU 계산 프로그램을 작성하기 위한 계산 셰이더 API를 제공한다.

일반적으로 Direct3D 응용 프로그램은 네이티브 C++로 작성하지만, 안정적인 Direct3D용

.NET래퍼들도 있으므로 3차원 그래픽 API에 접근 할 수 있다.


기초적으로 갖고 있어야할 지식

- 고등학교 수준의 수학 : 기하학, 삼각함수, 함수

- Visual Studio에 익숙한 실력, 프로젝트 생성, 파일 추가, 링크할 외부 라이브러리 지정 등 (링커개념에 대한 전반적인 이해도)

- 중급 C++ 및 자료구조 지식 : 포인터, 배열, 연산자 중복적재, 연결된 목록, 상속, 다형성 등에 대한 이해

- Win32 API를 이용한 Windows 프로그래밍에 익숙한 기능 활용도

 

지금 현재 내 수준

- 수학에 대한 전반적인 이해도는 있으나, 교육이 11년이 지나서 다시 복습할 필요성 있음...

- Visual Studio에 대하여 익숙하지 않아, 계속 추가적인 학습 필요로함. 기초적인 것부터 포인터 함수까지 이해도 높이기

- 자료구조, 알고리즘에 대한 지식 및 위와 같은 공부 지속적으로 하기.. 계속 공부하자


D3DX 라이브러리 사용하기.

버전 7.0부터 DirectX SDK는 D3DX(Direct3D Extension)이라는 라이브러리를 함께 제공해준다.

라이브러리에는 다음과 같은 구성요소들을 포함하고 있다.

수학 연산 3D 연산을 위해 다양한 수학도구를 활용한다. 대표적으로
Vector : 위치, 방향, 속도 등의 표현
Matrix : 회전, 이동, 확대 등의 변환에 사용된다.
Quaternion : 3D 회전 계산에 사용, 짐벌락(Gimbal Lock) 회피
Geometry : 광선 - 충돌, 면 교차 등
<DXMath> 라이브러리 (DirectXMath.h)를 통해 연산을 지원해주며, 내부적으로는
XMMatrixMultiply(), XMVectorAdd(), XMQuaternionMultiply() 의 자료형을 활용한다.
텍스처 및 이미지 연산
(Texture & Image Operations)
텍스처(Texture) : 2D 이미지 데이터를 GPU 메모리에 올려서 표면에 입히는데 사용한다.
샘플러(Sampler) : 텍스처를 샘플링(필터링, 래핑 등 처리 방식 정의)
렌더 타겟(Render Target) : 이미지를 출력하거나 중간 결과를 저장하는 표면
이미지 연산() : 색상 조정, 블렌딩, 필터링, 다중 텍스처링 등 셰이더에서 주로 처리한다.
셰이더 연산(컴파일과 어셈블 등)
(Shader Operations -
Compile & Assembly)
셰이더(Shader) : GPU에서 실행되는 작은 프로그램. HLSL(High_Level Shader Language)
 - 버텍스 셰이더 (Vertex Shader) : 정점(꼭지점) 처리
 - 픽셀 셰이더 (Pixel Shader) : 픽셀 렌더링
 - 컴퓨트 셰이더 (Compute Shader) : 범용 연산
컴파일(Compile) : .hlsl 파일을 바이너리(.cso)로 변환
 - D3DCompileFromFile() 같은 함수 사용
어셈블(Assembly) : 셰이더 바이너리를 GPU 명령으로 번역
함수(그래픽 연산 간단화)
(Functions)
DirectX의 그래픽 연산을 간단하게 처리하기 위한 도우미 함수들이 많다.
렌더링 루프 내 주요함수
 - ClearRenderTargetView() : 화면 클리어
 - DrawIndexed() : 인덱스 기반 도형 렌더링
 - Present() : 화면 출력
행렬 변환
 - XMMatrixLookAtLH() : 카메라 뷰
 - XMMartrixPersperctiveFovLH() : 원근 투영
함수는 보통 Low-level API를 wrapping 하여 사용을 간단화시킨다.
클래스 C++에서 DirectX 연산을 체계화하기 위해 주로 클래스 구조를 사용합니다.
  • 렌더링 엔진 클래스 구조 예시:
    • DeviceManager – 디바이스, 스왑체인, 컨텍스트 관리
    • ShaderManager – 셰이더 로딩/컴파일 관리
    • TextureManager – 텍스처 생성/로드/삭제
    • Scene / GameObject – 씬 구성 요소
  • Direct3D 객체들은 COM 기반이므로 ID3D11Device, ID3D11Buffer 같은 인터페이스 포인터를 멤버로 포함
인터페이스 DirectX는 COM(Component Object Model) 기반으로 되어 있으며, 다양한 인터페이스 객체가 존재합니다.
  • 주요 인터페이스 예
    • ID3D11Device – GPU 장치 생성 및 리소스 생성
    • ID3D11DeviceContext – 렌더링 명령 실행
    • IDXGISwapChain – 프레임 버퍼 교체
    • ID3D11RenderTargetView – 렌더 타겟 지정
    • ID3D11InputLayout – 버텍스 포맷 지정
    • ID3D11Buffer – 정점/인덱스/상수 버퍼

정보를 찾아보니, 궁금해진 함수가 있어서 찾아보았다.


D3DCompileFromFile() 함수


HLSL 파일(.hlsl 등)을 컴파일하여 Direct3D에서 사용할 수 있는 셰이더 바이트코드(Shader Bytecode)로 변환하는 함수이다.

이 바이트코드는 GPU에 로드되어 실행된다. 내부적인 함수의 형식은 아래와 같았다.

HRESULT D3DCompileFromFile(
  LPCWSTR           pFileName,        // 셰이더 파일 경로
  const D3D_SHADER_MACRO *pDefines,   // 매크로 정의 (NULL 가능)
  ID3DInclude       *pInclude,        // include 파일 처리기 (일반적으로 NULL)
  LPCSTR            pEntryPoint,      // 진입 지점 함수명 (예: "main")
  LPCSTR            pTarget,          // 셰이더 모델 (예: "vs_5_0")
  UINT              Flags1,           // 컴파일 옵션 (예: D3DCOMPILE_DEBUG)
  UINT              Flags2,           // 이펙트 관련 옵션 (일반적으로 0)
  ID3DBlob          **ppCode,         // 컴파일된 셰이더 바이트코드 (출력)
  ID3DBlob          **ppErrorMsgs     // 에러 메시지 정보 (출력, NULL 가능)
);

주의 사항으로는 파일 경로를 반드시 유니코드 문자열 (L"파일명")으로 전달해야한다.

최종적으로는 shaderBlob, errorBlob는 Release()로 해제해야 메모리 누수를 방지할 수 있다.

'이론 > DirectX' 카테고리의 다른 글

Time 관련  (0) 2025.06.02
DirectX 윈도우 창 띄우기  (0) 2025.06.01
래스터라이즈(Rasterize)란?  (0) 2025.05.30
미리 컴파일 된 헤더(Precompiled Header : PCH)  (0) 2025.05.29
DirectX 관련 라이브러리  (0) 2025.05.28