1. Direct3D API Interface & Function
1.1 Vertex & Input Layout
1.1.1 Direct3D Vertex
- 공간적 위치 이외에 추가적인 자료를 가질 수 있고 원하는 자료를 사용하려면 원하는 구조체 정의
- 하나는 위치와 색상, 하나는 위치, 법선, Texture 좌표로 구성
struct Vertexl { XMFLOAT3 Pos; XMFLOAT4 Color; };
struct Vertex2 { XMFLOAT3 Pos; XMFLOAT3 Normal; XMFL0AT2 TexO; XMFLOAT2 Texl; };
- 정점 구조체의 각 성분이 어떤 용도인지 Direct3D에게 알려 주어야 함
1.1.2 Input Layout
- 위의 방식을 알려주는 수단으로 구조체들로 이루어진 배열을 통해 구축
- 정점 구조체의 성분이 두개라고 하면 구조체 또한 배열의 원소도 두개여야 함
typedef struct D3D11_INPUT_ELEMENT_DESC;
- 처음 생성한 정점의 구조체로 부터 각 성분이 어떠한 용도 인지 알려줌
D3D11_INPUT_ELEMENT_DESC descl [] =
{ {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0 D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", ᄋ, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} };
- Input Layout & Vertex가 완성을 하였으므로 함수를 호출하여 Input Layout을 생성
void ID3DllDevice::CreateInputLayout;
- 정점 셰이더에 대해 매개변수를 받고, 정점 구조체의 성분들은 정점 셰이더의 적절한 입력 매개변수에 대응
- 밑의 코드로 인해 InputLayout이 생성이 되고 입력 배치를 통해 물체를 그림
ID3D11InputLayout* mlnputLayout; // 입력 배치 객체 생성
md3dImmediateContext->IASetInputLayout(mInputLayout);
1.2 Vertex Buffer
1.2.1 Vertex Buffer
- GPU가 정점 배열에 접근하려면 배열의 정점들의 버퍼라 부르는 특별한 자원에 담아 두어야 함
- CPU나 GPU가 자료에 어떻게 접근하는지 파이프라인의 어디에 묶이는지에 대한 정보를 가짐
typedef struct D3D11—BUFFER_DESC; typedef struct D3D1l_SUBRESOURCE_DATA;
- 구조체로 정점 버퍼를 생성할 수 있으며 파이프라인에 공급하려면 버퍼를 장치의 한 입력 슬롯에 붙여야 함
void ID3DllDeviceContext::IASetVertexBuffers;
- 정점 버퍼를 입력 슬롯에 지정한 후 그리기 연산을 시작하려면 밑의 함수를 호출
void ID3DllDeviceContext::Draw(UINT VertexCount, UINT StartVertexLocation);
1.2.2 Dynamic Vertex Buffer
- 정적 버퍼의 내용은 초기화 시점에서 고정되지만 동적 버퍼인 경우 실행 시점에서 얼마든지 변경 가능
- 매 프레임마다 변하는 경우가 많고 시간의 흐름에 따라 갱신되는 메시를 표현하기 위해 동적 정점 버퍼가 필요
- 복잡한 물리 계산과 충돌 검출을 수반하는 입자 시스템
- 매 프레임마다 GPU에서 물리 계산과 충돌 검출을 수행하여 각 입자의 새 위치를 구해야함
- 따라서 구조체를 생성할 때 밑의 코드처럼 동적으로 생성해야 하고 CPU에서 접근이 가능해야 함
D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_DYNAMIC; vbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- 동적 정점 버퍼를 갱신할 때 밑의 함수를 통해 버퍼의 메모리 블록의 시작을 가리키는 포인터를 얻음
- 얻은 후 그 메모리 블록에 자료를 기록하고 반드시 버퍼를 갱신한 후는 Unmap 함수 실행
typedef struct D3D11_MAPPED_SUBRESOURCE;
HRESULT ID3DllDeviceContext::Map;
// Contents
ID3DllDeviceContext: : Unmap
- 새 자료를 CPU 메모리에서 GPU 메모리로 전송해야하므로 약간의 추가 부담이 생김
- 동적 버퍼의 필요성을 줄여주는 새로운 기능 추가
- 간단한 애니메이션은 정점 셰이더에서 수행 가능
- 기하 셰이더를 이용하면 기본 도형의 생성 및 파괴 작업을 GPU에서 수행 가능
- 텍스쳐로의 렌더링 기능 또는 계산 셰이더, 그리고 정ㅈ머 텍스쳐 조회 기능을 이용하면 GPU에서 실행 가능
1.3 Index & Index Buffer
1.3.1 Index Buffer
- GPU에 접근할 수 있는 특별한 자원을 넣어야 하므로 정점 버퍼의 생성과 비슷하게 생성
- Index Buffer를 파이프라인에 묶어야 하므로 밑의 함수를 통해 입력 조립기 단계에 묶음
md3dlmmediateContext->IASetIndexBuffer(mIB, DXGIFORMAT_R32_UINT, 0);
- 정점 버퍼와 다르게 Index Buffer를 이용해서 기본 도형을 그릴 때 Draw Indexed 함수를 사용
void ID3DllDeviceContext::Drawlndexed(UINT IndexCount, UINT StartIndexLocation, INT BaseVertexLocation);
'C++ Algorithm & Study > Game Math & DirectX 11' 카테고리의 다른 글
[Direct11] 10. Direct3D Effect Framework (0) | 2023.06.14 |
---|---|
[Direct11] 9. Direct3D API Interface & Function #2 (0) | 2023.06.14 |
[Direct11] 7. Rendering Pipeline - Pixel Shader & Output Merger (PS & OM) (0) | 2023.06.13 |
[Direct11] 6. Rendering Pipeline - Tessellation & Rasterizer (TS & RS) (0) | 2023.06.13 |
[Direct11] 5. Rendering Pipeline - Vertex Shader (VS) (0) | 2023.06.13 |