수업
주제
DirectX11 1주차 복습 – 그래픽스 파이프라인의 구성과 필수 개념 정리
DirectX11로 3D 렌더링을 하기 위한 최소 단위로, 장치 초기화, 버퍼 생성, 셰이더 설정, UV 맵핑, ConstantBuffer 활용까지의 전체 흐름을 한 주차 동안 배운 내용을 중심으로 복습하며 정리한 글이다.
개념
🎮 1. DirectX 장치 구성 요소
✔ Device
- GPU를 대표하는 객체.
- 모든 GPU 리소스를 생성하는 역할을 수행함.
- 예: VertexBuffer, IndexBuffer, Shader, Texture 등을 생성할 때 사용.
✔ DeviceContext
- 렌더링 파이프라인을 제어하는 객체.
- 각 단계의 상태를 설정하고 명령을 GPU로 보냄.
VSSetShader, RSSetState, OMSetRenderTargets 등 모든 파이프라인 연결 명령을 관리함.
✔ SwapChain
DXGI 라이브러리 소속 객체로, DirectX보다 기술 변화가 느린 디스플레이 장치 관련 기능을 담당.
- 후면 버퍼에서 전면 버퍼로 빠르게 복사하는 역할을 함. (더블 버퍼링)
Present() 함수로 호출되어 화면에 최종 출력이 이루어짐.
🖼 2. 장치 초기화 흐름
Render 함수 호출 흐름
- 게임 루프에서 매 프레임 호출됨.
- 렌더링 시작 → 그리기 → 렌더링 종료 순서.
📌 RenderBegin
OMSetRenderTargetView: 후면 버퍼에 그림을 그릴 수 있도록 설정.
ClearRenderTargetView: (보통 한번만 하면 되므로 생략 가능) 매 프레임 배경 색상 초기화.
RSSetViewports: 렌더링 결과를 어느 화면 범위에 출력할지 결정. RS 단계에서 수행됨.
📌 RenderEnd
SwapChain->Present(): 후면 버퍼에서 전면 버퍼로 빠른 복사를 수행하여 실제 화면에 출력됨.
🔺 3. 삼각형 그리기 과정 요약
📌 Vertex 정보 생성
- 정점 좌표(x, y, z), 색상, UV 정보 등을 담는 구조체 배열을 CPU 메모리에 먼저 생성함.
📌 VertexBuffer 생성
- 생성된 Vertex 정보를 GPU에 전달하기 위해 버퍼를 생성.
- 주의: GPU에서는 기본적으로 읽기 전용(Immutable) 으로 사용됨.
📌 IndexBuffer 생성
- 정점이 많아질수록 중복되는 정점이 생기므로, 중복을 줄이기 위해 정점의 인덱스만 배열로 저장하여 사용.
- 이는 GPU의 효율적인 연산을 가능하게 함.
- GPU에 넘긴 VertexBuffer가 어떤 구조인지 설명함.
- 예:
position, uv, color 등의 구조를 정의하고, 셰이더에서 그 순서를 인식할 수 있도록 전달함.
- 셰이더와 밀접하게 연결됨. 정확히 일치하지 않으면 렌더링 실패.
🧠 4. Shader 관련 요소
📌 LoadShaderFromFile
- 직접 정의한 함수.
- HLSL로 작성한
.hlsl 파일을 컴파일하여 ID3DBlob 객체에 저장.
- 이 Binary 데이터를 기반으로 셰이더 리소스를 생성.
📌 CreateVS / CreatePS
- VertexShader, PixelShader를 생성.
- 위에서
LoadShaderFromFile()로 로드한 ByteCode 데이터를 이용해 리소스 객체로 전환.
📌 Render 단계에서 셰이더 셋팅
_deviceContext->VSSetShader(...), _deviceContext->PSSetShader(...) 등을 통해 생성된 셰이더를 바인딩.
🧩 5. UV 맵핑
개념
- 텍스처를 2D 이미지 좌표(UV) 를 통해 정점에 입히는 것.
- 일반적으로 UV 좌표는 0~1 범위를 가짐.
구현
- Geometry 생성 시, 정점마다 UV 좌표를 함께 입력.
- 셰이더의 PS(Pixel Shader)에서
texture.Sample(sampler, uv) 형태로 사용.
- UV 좌표가 0~1을 벗어날 경우, SamplerState에서 정의한 규칙에 따라 경계가 처리됨 (예: Clamp, Mirror, Border 등).
📦 6. Constant Buffer
필요성
- Geometry의 VertexBuffer, IndexBuffer는 보통 한 번 생성하면 변하지 않음.
- 하지만 위치, 회전, 스케일 등의 변화는 매 프레임 반영되어야 함.
- 이를 위해 상수 버퍼(Constant Buffer) 를 사용하여 매 프레임 CPU에서 GPU로 데이터 전달.
구현
D3D11_BUFFER_DESC를 만들 때 Usage = D3D11_USAGE_DYNAMIC, CPUAccessFlags = D3D11_CPU_ACCESS_WRITE로 설정.
- Map/Unmap을 통해 CPU가 해당 버퍼에 접근해 값을 갱신하고, 셰이더에 바인딩함.
핵심
- Device / DeviceContext / SwapChain은 DirectX 렌더링의 필수 3대 구성요소다.
- RenderBegin / RenderEnd 사이가 실제로 도형을 그리는 영역이다.
- VertexBuffer는 정점의 모양 정의, IndexBuffer는 정점의 연결 정의, InputLayout은 그 구조 정의.
- 셰이더는 직접 작성하고 로드해서 사용하며, 각 단계에 맞게 바인딩해줘야 한다.
- UV 맵핑은 텍스처 좌표 개념이며, PS 단계에서 텍스처에 접근하기 위한 핵심.
- Constant Buffer는 물체의 위치, 회전, 크기 등 매 프레임 변화하는 데이터를 전달하기 위한 수단이다.
- 버퍼 생성 시 Dynamic 설정과 Map/Unmap 사용이 핵심 구현 포인트다.