버텍스 그릴 순서를 정의해둔 인덱스를 담는 버퍼
동일한 프리미티브 타입에 대한 버텍스 버퍼, 인덱스 버퍼를 캐시
class FBufferCache
{
private:
TMap <EPrimitiveType, FVertexBufferInfo> VertexBufferCache;
TMap <EPrimitiveType, FIndexBufferInfo> IndexBufferCache;
TMap <EPrimitiveType, TArray<FVertexSimple>> PrimitiveVertices;
public:
FBufferCache();
~FBufferCache();
void Init();
FVertexBufferInfo GetVertexBufferInfo(EPrimitiveType Type);
FIndexBufferInfo GetIndexBufferInfo(EPrimitiveType Type);
public:
TArray<FVertexSimple> CreateConeVertices();
TArray<FVertexSimple> CreateCylinderVertices();
private :
FVertexBufferInfo CreateVertexBufferInfo(EPrimitiveType Type);
FIndexBufferInfo CreateIndexBufferInfo(EPrimitiveType Type);
TArray<UINT> CreateDefaultIndices(int Size);
};
struct FIndexBufferInfo
{
public:
FIndexBufferInfo() = default;
FIndexBufferInfo(ID3D11Buffer* InIndexBuffer, int InIndexBufferSize)
{
IndexBuffer = InIndexBuffer;
IndexBufferSize = InIndexBufferSize;
}
ID3D11Buffer* GetIndexBuffer() const { return IndexBuffer.Get(); }
int GetSize() const { return IndexBufferSize; }
Microsoft::WRL::ComPtr<ID3D11Buffer> IndexBuffer;
int IndexBufferSize;
};
현재 사용중인 프리미티브 타입을 렌더링하기 위한 함수
void URenderer::RenderPrimitive(UPrimitiveComponent* PrimitiveComp)
{
if (BufferCache == nullptr)
{
return;
}
// 버텍스
FVertexBufferInfo VertexInfo = BufferCache->GetVertexBufferInfo(PrimitiveComp->GetType());
if (VertexInfo.GetVertexBuffer() == nullptr)
{
return;
}
auto Topology = VertexInfo.GetTopology();
{
DeviceContext->IASetPrimitiveTopology(Topology);
CurrentTopology = Topology;
}
ConstantUpdateInfo UpdateInfo{
PrimitiveComp->GetWorldTransform().GetMatrix(),
PrimitiveComp->GetCustomColor(),
PrimitiveComp->IsUseVertexColor()
};
UpdateObjectConstantBuffer(UpdateInfo);
// 인덱스
FIndexBufferInfo IndexInfo = BufferCache->GetIndexBufferInfo(PrimitiveComp->GetType());
ID3D11Buffer* VertexBuffer = VertexInfo.GetVertexBuffer();
ID3D11Buffer* IndexBuffer = IndexInfo.GetIndexBuffer();
int Size = IndexBuffer ? IndexInfo.GetSize() : VertexInfo.GetSize();
RenderPrimitiveInternal(VertexBuffer, IndexBuffer, Size);
}
버텍스 정보에 담긴 토폴로지를 적용
IASetPrimitiveTopology 콜 최소화할 수 있도록 렌더링패스 분리인덱스 버퍼 존재여부에 따라 렌더링 로직 분리
void URenderer::RenderPrimitiveInternal(ID3D11Buffer* VertexBuffer, ID3D11Buffer* IndexBuffer, UINT Size) const
{
UINT Offset = 0;
DeviceContext->IASetVertexBuffers(0, 1, &VertexBuffer, &Stride, &Offset);
if (!IndexBuffer)
{
DeviceContext->Draw(Size, 0);
}
else
{
DeviceContext->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
DeviceContext->DrawIndexed(Size, 0, 0);
}
}