28 ResourceManager
Game class 전역 사용Game class{ ...}extern unque_ptr GGame();extern을 통해 GGame이라는 변수를 전역에서 참조할 수 있도록 만들어준다이를 통해 Game 객체를 변수로 만들어서 사용했던 API에서 GGame으로 찾아서 바꿔준다다 고치고 문제가 없는지 빌드를 하게되면 GameObejct의 FixedUpdate()함수에서 예외가 발생할수도 있다이것을 확인해보면 component가 null일때 FixedUpdate()함수가 불려지는 것이므로 예외처리를 해준다이미지 안뜸그리고 다시 실행시 창은 뜨지만 이미지는 아무것도 뜨지 않을것이다이는 구조를 계속해서 바꾸면서 MeshRenderer의 Render() 함수를 어디서도 호출해주지 않기 때문이다하지만 MeshRe..
2025.01.12
27 SceneManager
SceneScene는 게임에서 관리하는 오브젝트들을 묶어서 통합으로 관리하는 클래스가 될 것이다즉 하나의 맵, 오브젝트, UI등을 모아 놓은 게임의 단위를 말한다Scene.h{public: const vector>& GetGameObjects() { return m_pGameObjects; }private: vector> m_pGameObjects;}-------------------------------------------------------------------------------------Scene.cppvoid Scene::Awake(){ for (const shared_ptr& game : m_pGameObjects) game->Awake();}void Scen..
2025.01.12
26 MeshRenderer
Camera와 Transform 나누기Camera class지금 우리 구조를 보면 물체마다 World, View, Projection을 넘겨주게 되면서 카메라가 있던 없던 카메라까지 쉐이더에서 연산을 계속해서 하게된다 이를 방지하기 위해 Shader에서 TransformData에서 카메라에 해당하는 View와 Projection을 다로 빼내어 따로 값을 받아올 수 있게 만들어준다마찬가지로 Shader에 World, View, Projection 값을 넘겨주는 TransformData 구조체에서도 Camera와 Transform 정보를 따로 보낼 수 있게 나눠준다GameObject ClassGameObject Class에서 Transform에 관련된 데이터를 상수 버퍼로 GPU에 복사해 넘겨줬던 것 ..
2025.01.12
25 Component
Component class - enum class로 Component에 필요한 정보들을 enum으로 들고 있을 것이다. - 이때 Script말고 Transform, MeshRnederer, Camera, Animator는 하나만 존재할 것이고 Script나 나중에 만들 것 들은 여러개 가지고 있을 수도 있다 - enum으로 FIXED_COMPONENT_COUNT의 시작 번호를 ComponentType::End -1를 통해 Index로 접근이 가능 할 수 있도록 만들어 준다 - Component 클래스에 Start처럼 게임이 시작 됐을 때 값을 초기화 해주거나 Update처럼 매 프레임 Update되는 정보를 변경해주는 함수 뿐만 아니라 Awake 처럼 게임이 시작되기 전 값이 호출이 되거나 Update..
2025.01.12
24 Transform
쿼터니언Vector3로만 회전을 나타내면 짐벌락이라는 현상이 발생한다이를 보완하기 위해 가상의 공간을 하나 더 만들어 Vector4로 회전을 계산한다짐벌락x,y,z축을 이용하여 회전을 할 때 축이 겹쳐지게 되면서 회전이 발생하지 않는 현상을 말한다bool Matrix::Decompose(Vector3& scale, Quaternion& rotation, Vector3& translation)Matrix로 만든 것을 역으로 분해 SRT로 분해해주는 함수Component기본 부품들을 추가해 GameObject 클래스에서 조립을 하여 가지고 있게끔 하는 클래스이다Transform이 클래스에서는 수학 시간에 배웠던 것을 토대로 SRT를 행렬로 만들어 스자이공부를 적용하여 연산을 하게 만들 것이므로 Compone..
2025.01.12
23 GameObject
GameObject모든 물체들을 묶어서 관리하기 위해 클래스로 묶은것이다pipelineinfo 같은 경우 물체마다 각각 가지고 그려주는 것이지 Render에서 모든 부분을 할 필요가 없다지금처럼 Render에 렌더링 파이프 라인을 모든 물체들을 하나의 렌더링 파이프 라인으로 그리는 것이 아닌 같은 애들끼리 묶어서 렌더링 파이프라인을 설정해 그리고 다른 물체들은 다른 설정을 통해 렌더링 파이프 라인을 그리는 식으로 하기위한 클래스이다GameObject 클래스에서는 오브젝트마다 자기 자신만의 정보를 가지고있고 그를 토대로 그림을 그리게 할 것이다생성자에서 객체들을 동적 할당을 해준 뒤 Create함수를 사용하여준다이는 Game의 Init에서 한 것을 그대로 가져와주면 된다Update함수에서는 scale, r..
2025.01.12
22 Pipeline
Rasterizer SamplerStateBlendStateGamevoid Game::Init(HWND hWnd){ ... sampler = make_shared(graphics->GetDevice()); ... rs = make_shared(graphics->GetDevice()); ... blend = make_shared(graphics->GetDevice()); rs->Create(); ... sampler->Create(); ... //CreateBlendState blend->Create(); ...}...void Game::Render(){ ... //RS deviceContext->RSSetState(rs->GetComPtr().Get()); //PS ....
2025.01.12
21 Shader
ConstantBuffer - constant buffer는 vs서 가장 많이 사용하므로 사실상 shader에 만들어야하지만 vs에 만들어줬다 - ConstantBuffer를 template로 만들어 어떤 종류의 Constant Buffer든 다 호환되어 만들 수 있게 하였다 - Constant Buffer를 만들어주는 부분과 GPU에 있는 데이터를 CPU로 복사해주는 부분을 함수로 만들어 사용할 수 있게 해줬다Shader - Shader에선 소멸자, Create는 상속받아 재정의 해줄 것이므로 가상화를 해주었다 - Enum으로 ShaderScop를 만들어 Shader가 현재 있는지, 어떤 Shader가 있는지 등을 활용하기 위해 만들었으며 비트 연산자를 사용하여 어떤 Shader가 사용중인지 확..
2025.01.12
20 Geometry
스마트 포인터를 사용한 이유장점동적으로 만든 메모리 공간뿐만 아니라 reference count가 관리되는 블록까지한번에 만들어주기 때문에 강의에서 일반적인 new 동적할당이 아닌 스마트 포인터를 사용단점사이클 문제에 대해 자유롭지 않아 항상 염두하고 작업해야 함Geometry - Geometry는 template로 만들어 Vertex에 대한 정보가 어떤것이 들어와도 호환이 될 수 있도록 만듦- 이때 vertex의 정보들 뿐만 아니라 index의 정보들도 저장할 수 있게 하였다VertexData - VertexData는 Texture와 Color 값을 선택하여 도형을 만들 때 색을 입혀줄 수 있게 구조체로 만들었으며 추후 더 추가가 될 것이다 - descs를 static으로 만들어 Shader에 넘..
2025.01.12