D3D12_RESOURCE_DESC::D3D12_RESOURCE_DIMENSION 필드에 의해서 자원의 구체적인 종류 지정
CD3DX12_RESOURCE_DESC bufferDesc = CD3DX12_RESOURCE_DESC::Buffer(1024); // 1024바이트 버퍼 생성
정적 기하구조(프레임마다 변하지는 않는 기하구조)를 그릴 떄, 최적 성능을 위해 정점 버퍼들을 기본 힙(D3D12_HEAP_TYPE_DEFAULT)에 넣음
정점 버퍼를 초기화한 후에는 GPU만 버퍼의 정점들을 읽으므로(기하구조 그리기위해), 기본 힙에 넣는 것이 합당
CPU는 기본 힙에 있는 정점 버퍼 수정 불가
6.2.2 기본 버퍼 생성 편의용 함수 작성
기본 버퍼 생성성
Microsoft::WRL::ComPtr<ID3D12Resource> d3dUtil::CreateDefaultBuffer(
ID3D12Device* device,
ID3D12GraphicsCommandList* cmdList,
const void* initData,
UINT64 byteSize,
Microsoft::WRL::ComPtr<ID3D12Resource>& uploadBuffer)
{
ComPtr<ID3D12Resource> defaultBuffer;
// 실제 기본 버퍼 자원 생성
ThrowIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(byteSize),
D3D12_RESOURCE_STATE_COMMON,
nullptr,
IID_PPV_ARGS(defaultBuffer.GetAddressOf())));
// CPU 메모리를 기본 버퍼에 복사하기 위해, 임시 업로드 힙 생성
ThrowIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(byteSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(uploadBuffer.GetAddressOf())));
// 기본 버퍼에 복사할 자료 서술
D3D12_SUBRESOURCE_DATA subResourceData = {};
subResourceData.pData = initData;
subResourceData.RowPitch = byteSize;
subResourceData.SlicePitch = subResourceData.RowPitch;
// 기본 버퍼 자원으로의 자료 복사 요청
// 보조 함수 UpdateSubresources는 CPU 메모리를 임시 업로드 힙에 복사,
// ID3D12CommandList::CopySubresourceRegion을 이용해서 임시 업로드 힘의 자료를
// mBuffer에 복사
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_DEST));
UpdateSubresources<1>(cmdList, defaultBuffer.Get(), uploadBuffer.Get(), 0, 0, 1, &subResourceData);
cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
// 주의 : 위의 함수 호출 이후에도 uploadBuffer를 계속 유지
// 실제로 복사를 수행하는 명령 목록이 아직 실행 X
// 복사 완료되었음이 확실해진 후에 호출자가 UploadBuffer 해제
return defaultBuffer;
}
```
메시지(Message) : 윈도우에서 발생하는 이벤트를 운영체제가 윈도우에 전달하는 데이터 모음
HINSTANCE : 메모리상 객체를 다루는 핸들
HWND : 윈도우 핸들
APIENTRY : 진입점 (WINAPI)와 동일
WNDCLASS : 윈도우 데이터 셋팅 구조체
typedef struct _WNDCLASS {
UINT style; // 클래스 스타일
WNDPROC lpfnWndProc; // 윈도우 프로시저
int cbClsExtra; // 클래스 추가 메모리
int cbWndExtra; // 윈도우 추가 메모리
HINSTANCE hInstance; // 인스턴스 핸들
HICON hIcon; // 아이콘 핸들
HCURSOR hCursor; // 커서 핸들
HBRUSH hbrBackground; // 백그라운드 브러시 핸들
LPCWSTR lpszMenuName; // 메뉴 이름
LPCWSTR lpszClassName; // 클래스 이름
} WNDCLASS, *PWNDCLASS;
WNDCLASS를 전역 변수로 저장하고 사용하면, 창이 여러개 되었을 떄, 같은 윈도우 셋팅에 사용가능 (아니면, 나중에 팝업창 등이랑 섞여서 문제 생길 수도 있음 )
RegisterClass({WNDCLASS}) : 윈도우 데이터 셋팅 등록
ShowWindow({WNDCLASS}, {int:창표시상태}) : 초기 표시 상태를 지정