버퍼 리소스는 완벽하게 입력된 데이터 컬렉션이며 , 요소로 그룹화가 된다. 버퍼를 사용하면 위치 벡터 , 기본벡터 , 꼭짓점 버퍼의 텍스처 좌표 , 인덱스 버퍼의 index, 디바이스 상태 같이 다양한 데이터를 저장할수있다 버퍼의 요소는 1~4개의 구성요소로 이루어진다 .
Vertex Buffer에 기하도형을 정의하는데 사용되는 꼭짓점 데이터가 포함이된다. 꼭짓점 데이터에는 위치 좌표 , 색상데이터 텍스처 좌표 데이터 , 기본데이터 등이 포함되어 있다.
위치좌표(Position): 정점의 3D공간 상의 위치를 나타냄
색상 데이터 (Color): 정점의 색상을 정의함
텍스처 좌표: 정점이 텍스처이미지에서 어떤부분과 매핑되는지를 지정함
법선벡터 : 표면의 방향을 나타내며 , 조명계산에 사용이됨
Vertex Buffer 는 정점별 데이터를 포함하고 각 정점은 세가지 요소 ( 위치 ,일반및 texture 좌표 )를 저장을한다 위치와 표준은 일반적으로는 32비트의 부동소수점(DXGI_FORMAT_R32G32B32_FLOAT) 3개와 32비트 부동 소수점 2개(DXGI_FORMAT_R32G32_FLOAT)를 사용하여 텍스처 좌표를 사용하여 지정이된다.
Vertex Layout
정점 데이터의 구조를 GPU에 알려주기위해 Input layout을 정의한다
D3D11_INPUT_ELEMENT_DESC 배열을 사용하여 레이아웃을 정의
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
{"TEXCOORD",0,DXGI_FORMAT_R32G32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},
};
Vertex Buffer 생성 코드
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Usage = D3D11_USAGE_IMMUTABLE; //데이터 초기세팅이후 바뀔일 없으면 immutable
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.ByteWidth = (uint32)sizeof(Vertex) * _vertices.size();
D3D11_SUBRESOURCE_DATA data;
ZeroMemory(&data, sizeof(data));
data.pSysMem = _vertices.data();
HRESULT hr = _device->CreateBuffer(&desc, &data, _vertexBuffer.GetAddressOf());
CHECK(hr);
Index Buffer는 Vertex Buffer에 대한 정수 offset을 포함하며 , 원형을 효율적으로 Rendering 하는데 사용이된다 . Index Buffer는 16bit or 32bit index의 순차 세트를 포함하며, 각 index는 Vertex Buffer에서 정점을 식별하는데 사용이된다. 라고 정의 되어있는데
쉽게 설명해서 Index 버퍼는 정점 데이터를 효율적으로 재사용하기 위해 인덱스를 저장하는 버퍼이다. 정점데이터가 중복 없이 작성되더라도 여러 삼각형혹은 기하도형을 저의하기위해 동일한 정점을 반복적으로 참조해야하는경우가 생길건데 이때 index buffer를 사용하면 정점데이터의 중복을 줄이고 GPU메모리 사용량을 최적화 시켜줄수가 있게된다.
//index
{
_indices = { 0,1,2,2,1,3 };
}
//indexBuffer;
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Usage = D3D11_USAGE_IMMUTABLE; //데이터 초기세팅이후 바뀔일 없으면 immutable
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
desc.ByteWidth = (uint32)sizeof(uint32) * _indices.size();
D3D11_SUBRESOURCE_DATA data;
ZeroMemory(&data, sizeof(data));
data.pSysMem = _indices.data();
HRESULT hr = _device->CreateBuffer(&desc, &data, _indexBuffer.GetAddressOf());
CHECK(hr);
}