전체 글

전체 글

    Gpu Vertex/Index Resource Pool<img src=">

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

    Mesh Rendering - 1 (Shader, ConstantBuffer, Vertex Index Buffer)

    이젠 저 삼각형을 좀 이렇게 저렇게 해서 만든 Mesh다. 우선 이전 포스트에서 사용했던 코드를 바탕으로 약간의 구조를 잡아본다. Shader여기서 Shader는HLSL 에서 PixelShader, VertexShader 매핑RootSignature, PSO 제작 이 정도만 한다.그리고, 각 Model이나 Mesh마다 각각 다른 Shader정보를 갖고있기 때문에 해당 정보를 담은 ShaderInfo 클래스를 만들어 Shader를 만들 때, 해당 정보에서 읽는다. ShaderInfo#pragma oncestruct ShaderInfo{ wstring _path; vector _inputLayoutDesc; D3D12_ROOT_PARAMETER* _signatureRootParam; uint32 _signa..

    삼각형 출력

    삼각형 출력

    삼각형이다. DirectX11에서는 데이터 넘기고 셰이더에서 처리하고 출력하고 가 끝이었다.하지만... DirectX12에선... 아니다... 삼각형!일단 간단한 삼각형을 그릴 때 필요한 것들은준비물삼각형 데이터(Vertex, Color)셰이더 데이터를 전달할 ResourceShader에서 어떤 데이터를 받을 것인지에 따른 SignaturePSO(Pipeline State Object)가 필요하다.삼각형 데이터void TriagleDemo::CreateTriangle(){ { Vec3 vertex = Vec3(0.0f, 0.5f, 0.0f); Vec4 color = Vec4(1.0f, 0.0f, 0.0f, 1.0f); VertexData data = {vertex, color}; _vertexDa..