[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);
블로그의 정보
농담곰담곰이의곰담농
브이담곰