Programming/DirectX12
-
각 게임오브젝트의 외곽선 그리기Programming/DirectX12 2022. 5. 13. 00:30
만들고있는 게임의 모델들이 로우폴리라서 외곽선을 그려주면 이쁠 것 같아 구현해보았다. 내가 구현한 방법은 다음과 같다. 1. 테두리를 그릴 게임오브젝트를 렌더링한다. └ 이때 스텐실 버퍼에도 값을 쓴다. └ 각 게임오브젝트를 렌더링할 때마다 스텐실 참조값을 1씩 증가시킨다. 2. 텍스쳐를 하나 만들고 여기에 스텐실 버퍼를 복사한다. 3. 화면을 가득 채우는 사각형을 렌더링한다. └ 이때 아까 만든 텍스쳐에서 소벨 필터를 이용해서 외곽선을 검출한다. └ 외곽선이라고 판정된 부분만 색깔의 알파값을 1로하고 나머지는 0으로 한다. // gameScene.cpp void GameScene::RenderOutlineObjects(const ComPtr& commandList) const { // 외곽선을 그릴 게..
-
해상도 변경Programming/DirectX12 2022. 5. 7. 23:37
해상도 변경은 게임에 없어서는 안된다. DirectX에서 해상도 변경하는 방법에 대해 정리해볼것이다. // main.cpp LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { ... case WM_SIZE: g_gameFramework.OnResize(hWnd, message, wParam, lParam); break; ... } 윈도우의 크기와 게임의 해상도 크기는 전혀 다른 것이다. 하지만 대부분의 유저들은 윈도우 크기와 해상도 같다고 생각한다. 나는 이전 게시글에 적은대로 사용자가 원하는 윈도우 크기를 선택하면 해상도도 그 크기에 맞게 변경하도록 했다. // framewo..
-
씬 분할, 전환Programming/DirectX12 2022. 4. 26. 20:40
게임을 하려고 켰을 때 시작부터 인게임이면 당연히 뭔가 이상할 것이다. 그래서 기존에 인게임 씬 하나만 있던 것을 로딩, 메인, 게임 씬으로 분할해볼 것이다. class Scene { public: Scene(); virtual ~Scene() = default; // 이벤트 함수 virtual void OnInit(const ComPtr& device, const ComPtr& commandList, const ComPtr& rootSignature, const ComPtr& postProcessRootSignature, const ComPtr& d2dDeivceContext, const ComPtr& dWriteFactory); virtual void OnInitEnd(); virtual void O..
-
D3D11on12, Direct2D, DirectWrite를 이용한 텍스트 출력Programming/DirectX12 2022. 4. 22. 01:22
UI를 위해 화면에 텍스트를 출력하는 것은 필수이다. 텍스트를 출력하는 방법 중 미리 만들어둔 텍스쳐를 이용하는 방법도 있지만, 해당 방법은 다른 폰트 종류와 크기를 사용하기 위해서는 텍스쳐도 따로 만들어야하고 한글은 출력할 수 없다는 단점 때문에 D3D11on12, Direct2D, DirectWrite를 이용해서 텍스트를 출력하게 됬다. void GameFramework::LoadPipeline() { // 팩토리 생성 CreateFactory(); // 디바이스 생성(팩토리 필요) CreateDevice(); // 명령큐 생성(디바이스 필요) CreateCommandQueue(); // 11on12 디바이스 생성(명령큐 필요) CreateD3D11On12Device(); // D2D, DWrite ..
-
케스케이드 그림자맵Programming/DirectX12 2022. 4. 12. 14:16
저번 게시글에서 그림자를 구현했지만 하나의 엄청 큰 그림자맵을 사용해서 그렸기 때문에 그래픽 메모리도 많이 사용하고 프레임 저하도 심했었다. 따라서 케스케이드 그림자맵을 사용하도록했다. 케스케이드 그림자맵 구현을 위해 우선 카메라의 뷰프러스텀을 몇 개의 구간으로 잘라야한다. 몇 개의 구간으로 자르는 것과, 해당 구간의 영역을 어떻게 설정할지는 개발자 맘대로다. // scene.cpp void Scene::UpdateShadowMatrix() { // 케스케이드 범위를 나눔 constexpr array casecade{ 0.0f, 0.05f, 0.2f, 0.4f }; ... } 나는 z값 기준 [0.0~0.05], [0.05, 0.2], [0.2, 0.4] 과 씬 전체 총 4가지고 나눴다. 마지막에 [0...