응애맘마조
230921 강의 본문
인스턴싱에 대해서 강의했습니다. 많은 오브젝트가 화면에 표시되면 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으로 잡고 만들도록 합니다.

읽어주셔서 감사합니다.
'공부 > 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 |