[DirectX 11] 정점 버퍼
by 브이담곰📑 전공과목 교수님의 개별적인 튜토리얼 스크립트를 바탕으로 작성되었습니다.😊
버퍼(Buffer) : GPU가 정점 배열에 접근할 수 있도록 특별한 자원에 넣어두는 곳.
-> ID3D11Buffer 인터페이스로 대표
정점버퍼란?
정점들을 담는 버퍼이다. Direct3D의 버퍼들은 자료를 담을 뿐만 아니라, CPU나 GPU가 자료에 어떻게 접근할 수 있고 버퍼가 파이프라인의 어디에 묶이는지에 대한 정보도 가진다.
D3D11_BUFFER_DESC 의 정의
typedef struct D3D11_BUFFER_DESC{
UINT ByteWidth;
D3D11_USAGE usage;
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
UINT StructureByteStride;
} D3D11_BUFFER_DESC;
1. ByteWidth: 생성할 정점 버퍼의 크기(바이트 단위)
2. Usage: 버퍼가 쓰이는 방식.
3. BindFlags: 정점 버퍼의 경우에는 D3D11_BIND_VERTEX_BUFFER를 지정한다.
4. CPUAccessFlags: CPU가 버퍼에 접근하는 방식을 결정하는 플래그들을 지정한다.
5. MiscFlags: 정점 버퍼는 이 플래그들이 필요 없다.
6. StructureByteStride: 구조적 버퍼에 저장된 원소 하나의 크기.
D3D11_SUBRESOURCE_DATA
typedef struct D3D11_SUBRESOURCE_DATA{
const void *pSysMem;
UINT SysMEmPitch;
UINT SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA;
1. pSysMem: 정점 버퍼를 초기화할 자료를 담은 시스템 메모리 배열을 가리키는 포인터. 정점n개를 담는 버퍼를 초기화하는 경우 초기화가 제대로 일어나려면 그 배열의 원소가 적어도 n개이어야 한다.
2. SysMemPitch: 정점 버퍼에는 쓰이지 않는다.
3. SysMEmeSlicePitch: 정점 버퍼에는 쓰이지 않는다.
// 원본 정점 자료를 정의한다.
VERTEX OurVertices[] =
{
{0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
{0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
{-0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)}
};
이 Vertec 형식은 다음과 같은 구조체이다.
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT4 Color;
};
// 버퍼 생성
// create the vertex buffer
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU
bd.ByteWidth = sizeof(VERTEX) * 3; // size is the VERTEX struct * 3
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer
// create the buffer
dev->CreateBuffer(&bd, // 생성할 버퍼를 서술하는 구조체
NULL, // 버퍼를 초기화하는 데 사용할 자료
&pVBuffer); // 생성된 버퍼가 여기에 설정된다.
// 생성된 버퍼의 정점들을 실제로 파이프 라인에 공급하기 위해서, 버퍼를 장치의 한 입력 슬롯에 묶는다.
devcon->IASetVertexBuffers(0, // 정점 버퍼들을 붙이기 시작할 입력 슬롯의 색인.(총16개.0~15)
1, // 호출에서 입력 슬롯들에 붙이고자 하는 버퍼들의 개수
&pVBuffer, // 붙일 정점버퍼들을 담은 배열의 첫 원소를 가리키는 포인터.
&stride, //보폭(stride)들의 배열의 첫 원소를 가리키는 포인터.
//stride = 해당 정점 버퍼의 한 원소의 바이트 단위 크기
&offset);// 오프셋들의 배열의 첫 원소를 가리키는 포인터.
//offset = 정점 버퍼의 시작 위치에서 입력 조립기 단계가 정점 자료를
읽기 시작할 정점 버퍼 안 위치까지의 거리를 말함.
정점버퍼를 사용한 코드의 전반적인 구조
// 정점 버퍼들을 생성한다.
ID3D11Buffer* pVBuffer; // the pointer to the vertex buffer
// 정점 버퍼를 이용해서 물체들을 그린다.
// select which vertex buffer to display
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
// 정점들의 그리기 연산 시작.
// draw the vertex buffer to the back buffer
devcon->Draw(3, 0);
'Client > directX' 카테고리의 다른 글
[DirectX11] Texture Normal(Bump) Mapping (0) | 2022.05.31 |
---|---|
[DirectX11] DirectX 초기화 와 3D 그래픽의 이해 (0) | 2022.04.21 |
[DirectX11] Render States (0) | 2021.12.19 |
[DirectX11] 2D 원 그리기 (0) | 2021.11.10 |
[DirectX 11] 3D Transformations (0) | 2021.11.04 |
블로그의 정보
농담곰담곰이의곰담농
브이담곰