전체 글

전체 글

    깊이버퍼, 버퍼 리소스 상태 추적, CommandPool과 업로드 수명, Material 지연 해제<img src=">

    깊이버퍼, 버퍼 리소스 상태 추적, CommandPool과 업로드 수명, Material 지연 해제

    뭐가 많다.지금까지 하면서 생겼던 잡다한 버그들을 수정 했다. 깊이버퍼지금까지 깊이 버퍼를 안썼다.(데헷~ ★ )사진을 보면 앞에 있는데 뒤에 있다. void Graphics::CreateBackBufferDSV(){ D3D12_DESCRIPTOR_HEAP_DESC desc = {}; desc.NumDescriptors = 1; desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; ThrowIfFailed(_device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&_dsvHeap))); _dsvDescriptorSize = _device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_D..

    Material

    현재까지, MeshRenderer가 들고있던, Shader, Texture를 하나의 클래스인 Material로 묶는다!그리고 Gpu에 Material Buffer에 한번만 올려, MaterialIndex로 Shader에서 접근해서 사용한다. 설계현재 구조이런식으로 하나의 Render는 각각 PSO와 Texture 값들을 갖고 넘겨준다.하지만 여기서 생기는 문제가, PSO와 Texture가 같은것을 사용한다면, 사용한 만큼 InstanceDesc가 늘어난다. 그리고, Shader가 같으면 그 제외한 부분이 달라도 Batch가 늘어난다. 개선된 구조이런식으로 Material에 묶어준다.이렇게 되면 InstanceDesc는 MaterialIndex는 4바이트만 필요하다. 업로드 양도 그 만큼 줄어들고, 같은 ..

    Instancing

    Instancing

    하나의 드로우콜로 N개의 똑같은 매시를 출력하는 많이 본 그것이다. 이전 사진을 보면 1024개의 매시를 출력을 해서 101 프레임까지 떨어졌다. 선행작업Shader 버전 업데이트https://commongamedeveloper.tistory.com/65원래 5.1로만 올리면 되는데 미래를 생각해서 6.6까지 올렸다.Description Allocatorhttps://commongamedeveloper.tistory.com/61 DescripterAllocator Pool개요Dx11 까지는 ID3D11ShaderResourceView 이런 객체를 만들려면 드라이버가 관리해줬지만... Dx12 부터는 없다. 개발자가 직접 해야 한다.이전에 MeshRendering 쪽을 보면 // Texture 전달 if(..

    Shader Model Update

    Shader Model Update

    서론원래 이 것에 관한 글을 예정이 없었지만, Instancing을 하기 전 Shader 버전을 올리면서 생긴 문제를 해결 하기 위해 만들었다. 내가 현재까지 사용한 Shader Model은 5.0이다. 일반적인 Instancing을 적용하는데 큰 문제는 없지만, Instance 마다 다른 Texture를 적용해 한번의 Draw로 하기 위해 올려야 했다. 그러면 5.1으로 올려도 괜찮지만, 나중에 Ray Tracing이나 Shader 캐싱 문제로 인해 그냥 한번에 6.6까지 올렸다. FXC와 DXC일단 5.1까지는 FXC, 6.0 부터는 DXC 이다.FXCDirectX 9 ~ 11 까지 사용하던 HLSL 컴파일러D3DCompile / D3DCompileFromFile: 함수 한 번 호출로 파일 읽기, i..

    Constant Buffer Pool

    Constant Buffer Pool

    이전 포스트 마지막에 각 ConstantBuffer가 각각 4KB의 메모리가 추가 되는 것을 확인 했다이걸 잡아보자 구조Upload만 하는 ConstantBufferPool을 만들어주자 일단 ConstantBuffer는 보통 하나의 프레임에서 한번 정도 사용하고 다음 프레임에서는 다른 값을 사용한다.그럼 현재 스왑체인 버퍼 카운트(현재 2개)만큼의 크기를 잡고 사용한다. 처음 프레임에서는 이런식으로 각 값들을 써놓고, 사용한다.그리고 전체 렌더링이 끝나는 부분에서 처음 사용한 페이지를 전부 지우고 다음 페이지에서 다시 사용한다.다만, 여기서 중요한 점이 있다.현재 렌더링이 끝났는지에 대한 Fence값을 체크해서 다음 페이지로 갈 때, 동기화를 해주자 다만 이 구조에서의 문제가 있다.https://ther..

    Gpu Vertex/Index Resource Pool

    Gpu Vertex/Index Resource Pool

    음... 현재 DirectX12를 하면서 Texture Pool 까지 만들어서 기분이 좋았지만... 문제를 하나 발견했다.매시 하나를 출력하면... Vertex,Index가 64KB씩 할당 받게 된다. 그러면 총 합 128KB씩 매시 하나당 증가 하게 된다.그래서 바로 전에 했던https://commongamedeveloper.tistory.com/62 GPU Memory Heaphttps://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator GitHub - GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator: Easy to integrate memory allocation library for Direct3D 12Easy..

    GPU Memory Heap

    GPU Memory Heap

    https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator GitHub - GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator: Easy to integrate memory allocation library for Direct3D 12Easy to integrate memory allocation library for Direct3D 12 - GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocatorgithub.com이렇게 DirextX의 메모리 풀 소스가 있긴 한데...공부하는 블로그니까 그냥 만들어 봤다. 개념일단, CPU와 GPU가 어떻게 핑퐁 하는지 보면CPU가 리소스를 로드DEFAULT..

    DescripterAllocator Pool

    DescripterAllocator Pool

    개요Dx11 까지는 ID3D11ShaderResourceView 이런 객체를 만들려면 드라이버가 관리해줬지만... Dx12 부터는 없다. 개발자가 직접 해야 한다.이전에 MeshRendering 쪽을 보면 // Texture 전달 if(_texture != nullptr) { ID3D12DescriptorHeap* heaps[] = { _texture->GetDescHeap().Get() }; COMMAND_LIST->SetDescriptorHeaps(1, heaps); COMMAND_LIST->SetGraphicsRootDescriptorTable(2, _texture->GetHandle()); }이 부분이다. 저기 Texture는 각 텍스처 클래스 마다 ID3D12DescriptorHeap을 할..