수업


주제

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의 효율적인 연산을 가능하게 함.

📌 InputLayout 구성

  • 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 사용이 핵심 구현 포인트다.

profile
李家네_공부방

0개의 댓글