본문 바로가기

전체 글

(308)
[DX12] 삼각형 그리기 Mesh는 정점으로 이루어진 물체이다. D3D12_HEAP_PROPERTIES heapProperty = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD); D3D12_RESOURCE_DESC desc = CD3DX12_RESOURCE_DESC::Buffer(bufferSize); DEVICE->CreateCommittedResource( &heapProperty, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&_vertexBuffer)); // Copy the triangle data to the vertex buffer. void* vertexDataBuff..
[C++] override 지정자 override 지정자는 가상함수를 재정의하는 함수를 지정할 수 있다. class BaseClass { virtual void funcA(); virtual void funcB() const; virtual void funcC(int = 0); void funcD(); }; class DerivedClass: public BaseClass { virtual void funcA(); // ok, works as intended virtual void funcB(); // DerivedClass::funcB() is non-const, so it does not // override BaseClass::funcB() const and it is a new member function virtual void ..
[DX12] 장치 초기화 개요 DirectX에서는 3d를 화면으로 그리기 때문에 지금까지 했던 것에 비해 훨씬 많은 계산이 필요하다. 그래서 CPU에서만 계산하는 것은 부족하기 때문에 GPU에서도 계산을 하게 된다. 이것을 외주라고 비유한다. 지금부터 외주를 보내는데 필요한 클래스들을 소개하겠다. Device Device는 인력 사무소다. 외주를 보낼 때 Device를 통해 보낸다. Device를 초기화할 때 CreateDXGIFactory로 DXGI를 사용할 수 있게 하고 CreateDevice는 그래픽 카드를 나타내는 객체를 생성한다. 그래서 외주를 보낼 때 이 객체를 통해 진행한다. // DXGI(DirectX Graphics Infrastructure) // Direct3D와 함께 쓰이는 API ::CreateDXGIFacto..
[C++] shared_ptr shared_ptr은 unique_ptr과 달리 여러개의 스마트 포인터가 하나의 객체를 같이 소유하는 경우에 사용한다. 이 경우에는 특정 자원을 몇개의 객체에서 가리키는지 추적한 다음 그 수가 0이 되면 해제를 해주는 방식이다. WinApi 게임 프레임워크에서 사용했던 레퍼런스 카운트와 같은 방식이다. 여러개의 shared_ptr들은 같은 객체를 가리킬 수 있고, 같은 객체를 가리키는 shared_ptr의 수만큼 레퍼런스 카운트가 증가한다. 참조 개수가 몇 개 인지는 use_count 함수를 통해 알 수 있다. shared_ptr들이 레퍼런스 카운트를 저장하는 방식은, 제어 블록을 이용한다. 제어 블록을 동적으로 할당하고 shared_ptr들이 필요한 정보를 공유한다. shared_ptr를 복사 생성할 ..
[C++] 스마트 포인터, unique_ptr C++의 포인터는 new로 할당을 하면, 반드시 delete로 해제해야 메모리 누수가 발생하지 않는다. 하지만 방대한 프로그램에서 프로그래머가 하나하나 빠지지 않고 할당된 포인터를 해제하는 것은 어려운 일이다. 그래서 만들어진 것이 스마트 포인터이다. 스마트 포인터는 포인터 객체이다. 포인터와 달리 객체는 함수가 종료될 때 자동으로 자신의 소멸자를 호출한다. 그래서 소멸자에 delete를 넣으면 메모리를 해제할 수 있고 이를 포인터에 적용한 것이다. Data* data = new Data(); Date* data2 = data; // data 의 입장 : 사용 다 했으니 소멸시켜야지. delete data; // ... // data2 의 입장 : 나도 사용 다 했으니 소멸시켜야지 delete data2..
[WinAPI] 게임 프레임워크 - 9. File Save, Load 게임 프레임워크에서는 Map을 Tile형으로 만들어 수정하고 저장, 불러올 수 있다. if (KEYDOWN("Save")) { ShowCursor(TRUE); DialogBox(WINDOWINSTANCE, MAKEINTRESOURCE(IDD_DIALOG1), WINDOWHANDLE, CMapEditScene::DlgProc); ShowCursor(FALSE); //파일명 이용 저장 char strFileName[MAX_PATH] = {}; WideCharToMultiByte(CP_ACP, 0, m_strText, -1, strFileName, lstrlen(m_strText), 0, 0); m_pStage->SaveFromPath(strFileName); } MapEditScene::Input에서 Ctr..
[WinAPI] 게임 프레임워크 - 8. Animation 게임 프레임워크에서 애니메이션을 ANIMATIONCLIP이라는 구조체에 저장한다. typedef struct _tagAnimationClip { ANIMATION_TYPE eType; ANIMATION_OPTION eOption; vector vecTexture; float fAnimationTime; float fAnimationLimitTime; float fAnimationFrameTime; int iFrameX; int iFrameY; int iFrameMaxX; int iFrameMaxY; int iStartX; int iStartY; int iLengthX; int iLengthY; float fOptionTime; float fOptionLimitTime; _SIZE tFrameSize; }..
[WinAPI] 게임 프레임워크 - 7. Collision Collision은 Scene 내 Collider을 가진 Object 들의 충돌처리를 한다. void CCollisionManager::Collision(float fDeltaTime) { if (m_CollisionList.size() < 2) { m_CollisionList.clear(); return; } list::iterator iter; list::iterator iterEnd = m_CollisionList.end(); --iterEnd; for (iter = m_CollisionList.begin(); iter != iterEnd; ++iter) { list::iterator iter1 = iter; ++iter1; list::iterator iter1End = m_CollisionList..