일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 직교 투영
- direct3d
- gitscm
- 게임 프로그래밍
- Direct3D12
- 네트워크
- 장치 초기화
- Frustum Culling
- 네트워크 게임 프로그래밍
- Render Target
- 동적 색인화
- 게임 클래스
- 노멀 맵핑
- 입방체 매핑
- light
- gitlab
- C++
- InputManager
- Dynamic Indexing
- 큐브 매핑
- DirectX
- Deferred Rendering
- 조명 처리
- 디퍼드 렌더링
- DirectX12
- 게임 디자인 패턴
- FrameResource
- TCP/IP
- 절두체 컬링
- effective C++
- Today
- Total
목록전체 글 (44)
코승호딩의 메모장
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cbPOXi/btsx3KC07Oq/C07IbhThvUV6tUoBBuqBrk/img.gif)
이번 글에서는 3D 세상을 더 사실적으로 표현할 수 있는 빛을 추가한다. 또한 이번 구현에서 중요한 점은 빛 정보를 쉐이더로 넘겨줄 때, 오브젝트 당 계속 데이터를 복사해 주는 것이 아니라 씬의 렌더 함수에서 프레임 당 한 번씩만 복사를 해주는 것이다. 일단은 프레임 당 상수 버퍼에 빛의 정보만 넣어줄 것이지만 더 나아가 뷰, 프로젝션 변환도 프레임 당 한 번씩만 업데이트를 할 것이다. 또한 프레임 당 상수 버퍼는 테이블이 아닌 루트 서술자를 이용하여 보내기로 한다. Light Info 우선 빛을 위해 어떠한 정보가 필요한지 살펴보자. enum class LIGHT_TYPE : uint8 { DIRECTIONAL_LIGHT, POINT_LIGHT, SPOT_LIGHT, }; 빛은 우선 Directiona..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dtJYxZ/btsxqykc1Av/F9szZqCIiGYEd5zKWzBk9k/img.gif)
이제까지 갖가지 오브젝트(게임 오브젝트, 쉐이더, 메쉬, 머티리얼, 컴포넌트 등)들을 씬 매니저의 LoadTestScene에서 하드 코딩으로 생성하여 리소스들을 관리하였다. 이번 글에서는 이러한 오브젝트들을 Resources라는 매니저 클래스에서 함께 관리할 수 있도록 구조를 다시 설계하려고 한다. 이 리소스들은 최상위 Object 라는 클래스의 상속을 받아 Resources 클래스에서 가지고 있을 수 있도록 한다. 또한 Resources는 모든 오브젝트들을 하나로 관리하기 때문에 싱글턴으로 만들기로 한다. 원래는 파일 입출력을 통해 오브젝트들을 받아주는게 정상이지만 이번 글에서는 다루지 않는다. Object 클래스 enum class OBJECT_TYPE : uint8 { NONE, GAMEOBJECT..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b2dsHG/btsxqtwuXB4/37eYr2ZjGHn0vc54LmcXmk/img.gif)
이전까지는 오브젝트당 상수버퍼에 간단한 Vec4 형식의 offset을 넘겨줘서 정점 쉐이더에서 입력 정점에 offset을 더하기만 하고 따로 행렬을 사용하여 MVP 변환을 하지 않았다. 이번 글에서는 카메라 컴포넌트를 생성하여 오브젝트당 상수버퍼에 MVP 행렬을 넘겨줘서 정점 버퍼에 알맞은 행렬변환을 수행하도록 구현한다. 하지만 한 가지 유의할 점은 월드 변환은 오브젝트당 수행이 일어나지만 카메라 변환, 투영 변환은 오브젝트 당 일어나는 것이 아닌 프레임 당 변환이 일어난다. 따라서 원래는 월드 변환만 오브젝트 당 상수 버퍼에 넘겨줘야 하지만 이번 글에서는 간단하게 MVP 변환을 모두 넘겨주고 다음 글에서 패스(프레임) 당 상수버퍼를 새로 만들어서 따로 정보를 넘겨주도록 하겠다. 더 나아가 카메라를 두 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cycV9g/btsxp2MpqC4/IHkdTaF5I5KnOJcnrJq3B0/img.png)
이번 글에서는 여러 오브젝트들을 Game이 아닌 Scene에서 관리하기로 한다. 따라서 Scene은 여러 개의 게임 오브젝트들을 가지고 있으며 이 씬들을 관리하는 SceneManager을 구현하기로 한다. 씬은 게임 플레이의 하나의 장면이며 실제 게임에서는 여러 개의 씬을 가지고 다음 씬을 이동하거나 이전 씬으로 이동하거나 한다. 그러나 현재는 하나의 씬만 사용하도록 하고 SceneManager에서는 스마트 포인터를 통해 하나의 ActiveScene만 관리하도록 한다. 이후에 씬을 늘릴 것이다. 실제 DirectX 게임을 구현하기 위해서는 씬을 로드하는 방식을 사용해야 할 것이다. 유니티나 언리얼에서 편리하게 씬을 제작하여 파일로 내보내고 이를 우리의 응용 프로그램에서 파싱 하여 로드하는 방식이 맞는 방..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bUsC6v/btsxp7moPET/CAoyxpMYUUcO9YbgzxVaGK/img.jpg)
이번 글에서는 유니티의 컴포넌트 구조와 비슷하게 엔진을 컴포넌트 구조로 설계하려고 한다. 오브젝트당 하나씩만 필요로 하는 컴포넌트로는 Transform, MeshRenderer 등이 있으며 그 밖의 직접 작성한 컴포넌트들은 스크립트라 하여 MONO_BEHAVIOUR을 상속 받는다. 따라서 고정 컴포넌트는 현재는 Transform과 MeshRenderer에 해당한다. GameObject 게임 오브젝트는 게임 상에 존재하는 캐릭터, 소품, 배경 등 컴포넌트의 컨테이너 역할을 하는 객체이다. 광원이 게임 오브젝트가 될 수도 있고, 카메라가 게임 오브젝트가 될 수도 있다. 그러나 씬에 배치하기 위해서는 게임 오브젝트는 무조건적으로 Transform 즉 위치 정보는 가지고 있어야 한다. 이를 기반으로 게임 오브젝..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/JmopR/btsxh8zzatN/LDeYhytTUaSRdkFFZFoSK0/img.png)
이번 글에서는 키 입력을 쉽게 받기 위한 InputManager 클래스와 시간 관리를 위한 GameTimer를 생성하도록 한다. 이 두 클래스는 엔진에서 한 개만 존재해야 하기 때문에 싱글턴 패턴을 이용하여 간편하게 관리하도록 한다. #define DECLARE_SINGLE(type)\ private:\ type() {}\ ~type() {}\ public: static type* GetInstance()\ {\ static type instance;\ return &instance;\ }\ #define GET_SINGLE(type)type::GetInstance() ex) GET_SINGLE(Timer)->GetDeltaTime(); 우선 싱글턴 패턴을 위해 #define을 이용하여 클래스에서 쉽게 ..