GameChoi
Choi Programming
GameChoi
전체 방문자
오늘
어제
  • 분류 전체보기 (468)
    • C++ Algorithm & Study (184)
      • C++ & Algorithm Strategies (45)
      • Game Math & DirectX 11 (72)
      • Server + UE5 (29)
      • Lyra Clone Coding (37)
    • Create Game (284)
      • [Window API] Game Client & .. (55)
      • [DirectX] DirectX 2D & 3D (155)
      • [UE5] BLUEPRINT & C++ (74)
    • odds and ends (0)
      • English (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GAME Client
  • Destination Move Packet
  • Player Move Packet
  • UE5
  • Direct11
  • Game Server
  • Player State
  • Network Worker
  • c++
  • Other Character
  • RPG Game
  • core
  • server
  • Game Room
  • Direct3D
  • protobuf
  • job queue
  • Algorithm Strategies
  • session
  • client

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GameChoi

Choi Programming

[Direct11] 8. Direct3D API Interface & Function #1
C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 8. Direct3D API Interface & Function #1

2023. 6. 14. 17:04

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
    'C++ Algorithm & Study/Game Math & DirectX 11' 카테고리의 다른 글
    • [Direct11] 10. Direct3D Effect Framework
    • [Direct11] 9. Direct3D API Interface & Function #2
    • [Direct11] 7. Rendering Pipeline - Pixel Shader & Output Merger (PS & OM)
    • [Direct11] 6. Rendering Pipeline - Tessellation & Rasterizer (TS & RS)
    GameChoi
    GameChoi

    티스토리툴바