DirectX
7.2 렌더 항목
Awesome Red Tomato
2022. 1. 6. 02:05
하나의 물체를 그리려면 버퍼 상수 등 묶고 설정하고 할 게 많다. 물체가 여러개이면 훨씬 복잡해진다.
물체를 그리는데 필요한 자료를 캡슐화하여 경량의 구조체로 만들면 편하다. 하나의 완전한 그리기 호출 명령을 렌더링 파이프라인에 제출하는 데 필요한 자료 집합을 이 책에서는 렌더 항목(render item)이라고 부른다.
struct RenderItem
{
RenderItem() = default;
// 이 행렬은 세계 공간에서의 물체의 위치, 방향, 크기를 결정.
XMFLOAT4X4 World = MathHelper::Identity4x4();
// 개체 데이터가 바뀌어 상수 버퍼를 갱신해야 함을 나타내는 플래그.
int NumFramesDirty = gNumFrameResource;
// ObectCB에 해당하는 GPU 상수 버퍼(디폴트 버퍼) 색인
UINT ObjCBIndex = -1;
MeshGeometry* Geo = nullptr;
D3D12_PRIMITIVE_TOPOLOGY PrimitiveType = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
UINT IndexCount = 0;
UINT StartIndexLocation = 0;
int BaseVertexLocation = 0;
};
응용 프로그램마다 효과나 렌더링 기법이 다를 수 있다. 그래서 물체를 그리는 방식에 기초해 해당 렌더 항목들을 여러 목록으로 조직화 한다. 같은 PSO를 사용하는 렌더 항목은 같은 목록에 둔다.
// 모든 렌더 항목
std::vector<std::unique_ptr<RenderItem>> mAllRenderItem;
// PSO별 렌더 항목
std::vector<RenderItem*> mOpaqueRenderItems;
std::vector<RenderItem*> mTransparentRenderItem;