DX11) VertexBuffer
VertexBuffer
GPU가 처리할 정점(Vertex) 데이터를 저장하는 DirectX 11의 기본적인 그래픽 리소스다.
3D 객체를 화면에 렌더링하려면 정점 데이터를 GPU에 전달해야 한다.
이 데이터를 저장하는 것이 버텍스 버퍼이다.
VertexBuffer가 필요한 이유
DirectX 11에서 GPU는 CPU로부터 데이터를 직접 가져올 수 없다.
GPU에서 데이터를 효율적으로 처리하려면 정점(Vertex) 데이터를 GPU 메모리(VRAM)에 올려야 한다.
이를 위해 버텍스 버퍼(Vertex Buffer)를 사용한다.
- 정점 데이터를 GPU 메모리에 저장하여 빠르게 처리 (CPU가 아닌 GPU에서 직접 접근 가능)
- GPU가 정점 데이터를 효율적으로 읽고 파이프라인에 전달할 수 있도록 최적화됨
- 정점 데이터를 지속적으로 유지하면서 여러 번 사용 가능 (매 프레임마다 다시 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) * 3
→ 3개의 정점 크기만큼 메모리 할당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 프로그래밍에서 매우 중요하다.
댓글남기기