VertexBuffer

GPU가 처리할 정점(Vertex) 데이터를 저장하는 DirectX 11의 기본적인 그래픽 리소스다.

3D 객체를 화면에 렌더링하려면 정점 데이터를 GPU에 전달해야 한다.

이 데이터를 저장하는 것이 버텍스 버퍼이다.

VertexBuffer가 필요한 이유

DirectX 11에서 GPU는 CPU로부터 데이터를 직접 가져올 수 없다.

GPU에서 데이터를 효율적으로 처리하려면 정점(Vertex) 데이터를 GPU 메모리(VRAM)에 올려야 한다.

이를 위해 버텍스 버퍼(Vertex Buffer)를 사용한다.

  1. 정점 데이터를 GPU 메모리에 저장하여 빠르게 처리 (CPU가 아닌 GPU에서 직접 접근 가능)
  2. GPU가 정점 데이터를 효율적으로 읽고 파이프라인에 전달할 수 있도록 최적화됨
  3. 정점 데이터를 지속적으로 유지하면서 여러 번 사용 가능 (매 프레임마다 다시 CPU에서 데이터를 보내는 방식보다 훨씬 효율적)

VertexBuffer의 역할

버텍스 버퍼는 3D 모델의 정점 데이터(위치, 색상, 텍스처 좌표, 노멀 벡터 등)를 저장하고, 그래픽 파이프라인(Input Assembler Stage)에서 사용하도록 바인딩한다.

📌 버텍스 버퍼의 주요 역할

역할 설명
정점 데이터 저장 정점(Vertex) 정보를 GPU 메모리에 저장
그래픽 파이프라인에서 사용 Input Assembler(IA) 단계에서 정점 데이터를 가져옴
정점 속성(Attribute) 관리 위치(Position), 색상(Color), 법선(Normal), 텍스처 좌표(UV) 등 저장
GPU에서 빠르게 읽기 최적화 CPU 대신 GPU에서 직접 처리하도록 VRAM에 배치

VertexBuffer의 주요 구성 요소

버텍스 버퍼에는 각 정점(Vertex)의 속성이 포함한다. 보통 3D 모델을 렌더링할 때 다음과 같은 정보가 필요하다.

속성 설명 데이터 타입
위치 (Position) 3D 공간에서의 정점 위치 float3 (X, Y, Z)
색상 (Color) 정점의 색상 정보 float4 (R, G, B, A)
텍스처 좌표 (UV) 텍스처 매핑에 사용 float2 (U, V)
법선 벡터 (Normal) 조명 계산에 사용 float3 (X, Y, Z)

VertexBuffer 생성 과정

DirectX 11에서 버텍스 버퍼를 생성하는 과정은 다음과 같은 4단계로 진행된다.

정점 데이터(Vertex Data) 생성

먼저, 사용할 정점 데이터를 준비한다.

Vertex VtxArr[3] = {};
VtxArr[0].vPos = Vector3(0.f, 1.f, 0.f);
VtxArr[1].vPos = Vector3(1.f, -1.f, 0.f);
VtxArr[2].vPos = Vector3(-1.f, -1.f, 0.f);

VtxArr[0].vColor = Vector4(1.f, 0.f, 0.f, 1.f); // 빨강
VtxArr[1].vColor = Vector4(0.f, 1.f, 0.f, 1.f); // 초록
VtxArr[2].vColor = Vector4(0.f, 0.f, 1.f, 1.f); // 파랑
  • 삼각형을 이루는 3개의 정점을 정의.

  • 각 정점의 위치(Position)와 색상(Color) 정보를 저장.

VertexBuffer 생성

DirectX 11에서 버텍스 버퍼를 생성하기 위해 D3D11_BUFFER_DESC 구조체를 설정한다.

D3D11_BUFFER_DESC VertexBufferDesc = {};
VertexBufferDesc.ByteWidth = sizeof(Vertex) * 3; // 정점 3개의 크기
VertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // Vertex Buffer로 사용
VertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC; // CPU에서 업데이트 가능
VertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // CPU가 접근 가능
  • ByteWidth = sizeof(Vertex) * 33개의 정점 크기만큼 메모리 할당
  • BindFlags = D3D11_BIND_VERTEX_BUFFER이 버퍼가 정점 데이터 저장용임을 지정
  • Usage = D3D11_USAGE_DYNAMIC자주 변경되는 정점 데이터를 위해 설정 (CPU 접근 가능)

초기 데이터 설정 및 버퍼 생성

버퍼를 GPU에 전달하기 위해 D3D11_SUBRESOURCE_DATA 구조체를 사용한다.

D3D11_SUBRESOURCE_DATA SubDesc = {};
SubDesc.pSysMem = VtxArr; // 정점 데이터 배열

_DEVICE->CreateBuffer(&VertexBufferDesc, &SubDesc, VertexBuffer.GetAddressOf())
  • SubDesc.pSysMem = VtxArr정점 데이터(VtxArr)를 GPU에 업로드.

  • _DEVICE->CreateBuffer(...)Vertex Buffer를 생성하고 GPU에 업로드.

VertexBuffer를 그래픽 파이프라인에 바인딩

렌더링 시, IASetVertexBuffers를 사용하여 버퍼를 GPU의 Input Assembler(IA) 단계에 연결한다.

UINT Stride = sizeof(Vertex);
UINT Offset = 0;
_CONTEXT->IASetVertexBuffers(0, 1, VertexBuffer.GetAddressOf(), &Stride, &Offset);
  • Stride = sizeof(Vertex)정점 하나의 크기(데이터 간격) 설정.
  • Offset = 0데이터를 처음부터 읽도록 설정.
  • IASetVertexBuffers(...)GPU가 정점 데이터를 읽을 수 있도록 설정.

결론

Vertex Buffer는 DirectX11에서 필수적인 요소이며, 주요 역할은 다음과 같다.

역할 설명
정점 데이터 저장 GPU에서 사용할 정점 정보를 메모리에 저장
그래픽 파이프라인에 전달 Input Assembler(IA) 단계에서 정점 데이터를 사용할 수 있도록 GPU에 제공
렌더링 성능 최적화 CPU가 아닌 GPU에서 정점 데이터를 직접 처리하여 성능 향상
정점 속성 관리 위치, 색상, 텍스처 좌표, 법선 등 다양한 속성을 저장

버텍스 버퍼는 GPU가 3D 모델을 렌더링하기 위해 필수적인 데이터 구조이며, 이를 효율적으로 관리하는 것이 DirectX11 프로그래밍에서 매우 중요하다.

태그: ,

카테고리:

업데이트:

댓글남기기