전체 글

전체 글

    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을 할..

    Cpu Memory Pool

    Cpu Memory Pool

    Cpu의 메모리를 관리 하기 위한 메모리 풀이다. 개념왜?? 그냥 할당 받으면 되는거 아니야?? 라는 의문이 들 수 있다. (안들면 어쩔 수 없고)일단, CPU가 하는 일에 대해서 약간의 해설을 해보겠다. CPU는 L1캐시, L2캐시, L3캐시 그리고 TLB가 있다.CPU의 코어는 L1캐시에 있는 64바이트 만큼의 데이터를 읽고, L2에서 다음 64바이트 만큼의 데이터를 받아서 읽는다.만약 L1캐시가 바이트를 읽다가 어? 이거 다른 주소의 메모리를 참조하는데? 하면L2에게, 만약, L2가 해당 메모리가 없다면L3에게, 만약 L3에 메모리가 없다면TLB에게, 만약 TLB에 메모리가 없다면 TLB에는 "지금 이미 쓰고 있는" 메모리에 대한 가상↔물리 매핑만 캐싱되어 있음.새로운 메모리를 요청하면, 이 가상주..

    Texture!

    Texture!

    그러하다. Texture다.Dx11과 굉장히 다르다.너무 다르다... 일단. 진행 해보자... 이론Dx11과 다른점은 Dx11때에는 그냥 ShaderResourceView로 그냥 넘겼다.Dx12에서는 조금 아니! 매우 큰 다른 방법으로 넘겨줘야 한다.이런식으로 CPU와 GPU 그리고 GPU에서 원하는 Texture가 있다고 하자Dx11에서는 그냥 읽고 메모리에 태우면 알아서 ㅃㅃ 했겠지만...Dx12에서는 다르다!! 이런식으로 CPU에서 텍스처를 읽고-> CPU와 GPU가 공유하는 메모리에 넣고-> 그걸 GPU에서 GPU만 들고 있는 메모리에 넣어준다. 그럼 왜 중간 공유 메모리에 두면 다 되는거 아니냐! 라고 할수 있지만...메모리 대역폭 차이CPU의 메모리와 GPU의 메모리를 계속해서 이동하게 되면 ..

    Mesh Rendering - 2

    Mesh Rendering - 2

    이전에 너무 코드만 있었지만... 어쩔수 없다 ㅠMeshRenderer이제 여기서!! 이전 포스트에서 만든 모든 것들을 잘 조립해서 Mesh를 표시한다. class MeshRenderer : public Renderer{ DECLARE_COMPONENT_TYPE(eComponentType::Renderer);public: MeshRenderer(); virtual ~MeshRenderer() override;public: void Init(shared_ptr> mesh, shared_ptr shader); virtual void Render() override;public: const D3D12_VERTEX_BUFFER_VIEW& GetVertexBuffer() { return _mesh->GetVert..