농담곰담곰이의곰담농

[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

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기