응애맘마조

230921 강의 본문

공부/3D강의

230921 강의

TH.Wert 2023. 9. 21. 19:19

인스턴싱에 대해서 강의했습니다. 많은 오브젝트가 화면에 표시되면 FPS가 많이 떨어지게 되는데 같은 메쉬파일을 하나로 묶음으로써 드로우콜을 한 번만 하여 FPS를 많이 떨어뜨리지 않는 것입니다.

enum class VertexType
{
    P,
    PC,
    PCN,
    PTN,
    MODEL,
    TERRAIN,
    PT,
    PS,
    PSV,
    PSP,
    PCNI,
};

먼저 enum class로 마지막에 PCNI를 추가했습니다. PCN에 Instance를 추가했다는 의미입니다.

struct VertexPCNI
{
    static D3D11_INPUT_ELEMENT_DESC LayoutDesc[];
};

그리고 레이아웃만 추가됩니다.

D3D11_INPUT_ELEMENT_DESC VertexPCNI::LayoutDesc[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12 + 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TRANSFORM", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
    { "TRANSFORM", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
    { "TRANSFORM", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
    { "TRANSFORM", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
};

트랜스폼만 밑으로 추가가 됩니다.

    ID3D11Buffer* instanceBuffer;
instance = nullptr;
instanceBuffer = nullptr;
instanceCount = 0;
void Mesh::CreateInstanceBuffer(Matrix* instance, UINT instanceCount)
{
    this->instance = instance;
    this->instanceCount = instanceCount;
    SafeRelease(instanceBuffer);

    //CreateInstanceBuffer
    {
        D3D11_BUFFER_DESC desc;
        desc = { 0 };
        desc.Usage = D3D11_USAGE_DEFAULT;
        desc.ByteWidth = sizeof(Matrix) * instanceCount;
        desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

        D3D11_SUBRESOURCE_DATA data = { 0 };
        data.pSysMem = instance;
        HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, &data, &instanceBuffer);
        assert(SUCCEEDED(hr));
    }
}

메쉬 클래스에도 인스턴스  버퍼가 추가되며 카운트를 0으로 잡고 만들도록 합니다.

큐브를 30 X 30 X 30을 출력했지만 FPS가 200 가까이 되는 모습

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

230525 ~ 230526 강의  (0) 2023.09.26
230922 강의  (0) 2023.09.22
230917 ~ 230920 강의  (0) 2023.09.20
230915 강의  (0) 2023.09.16
230914 강의  (0) 2023.09.14
Comments