일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 게임 프로그래밍
- Direct3D12
- 장치 초기화
- 입방체 매핑
- Render Target
- gitlab
- 직교 투영
- C++
- InputManager
- gitscm
- DirectX12
- 노멀 맵핑
- TCP/IP
- 디퍼드 렌더링
- Frustum Culling
- light
- 네트워크
- 네트워크 게임 프로그래밍
- Deferred Rendering
- 게임 클래스
- Dynamic Indexing
- DirectX
- FrameResource
- 절두체 컬링
- effective C++
- 큐브 매핑
- 게임 디자인 패턴
- 동적 색인화
- 조명 처리
- Today
- Total
목록DirectX (14)
코승호딩의 메모장
![](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을 이용하여 클래스에서 쉽게 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/FdYXc/btsxh9ylh2O/YRkVifOqyoJYDFExqkgQoK/img.jpg)
이전에 텍스쳐 맵핑을 할 때, 텍스쳐의 정보를 Mesh가 가지고 있도록 하였다. 그러나 모든 게임엔진에서는 Material이라는 재질 정보에서 텍스쳐를 가지고 있으며 추가적으로 fresnel, roughness, diffuseAlbedo 등 빛에 대한 상호작용을 하는 정보들도 가지고 있다. 따라서 Material이라는 클래스를 하나 만들어서 재질과 텍스쳐에 대한 정보는 모두 이 Material에서 관리하도록 하자. 참고로 Material은 Mesh마다 바뀌어야 하는 정보이기 때문에 이 정보들을 쉐이더에 넘길 때, 상수 버퍼의 형태로 FrameResource에 추가하여 넘겨줘야 한다. 우선 Material에 필요한 인자들을 생각해 보면 빛과의 상호작용을 위한 변수들과 텍스쳐를 움직일 수 있는 행렬 정보와 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wS3cN/btsxtWRAovm/DgziA7s0xGRKxYXqd7Fa80/img.jpg)
이번 글에서는 텍스쳐 맵핑을 사용하여 간단한 사각형에 텍스쳐를 입히도록 한다. 이전에 만들었던 서술자 테이블에 CBV이든 SRV이든 그냥 CopyDescriptors를 이용하여 서술자를 복사하면 되기 때문에 쉽게 구현할 수 있을 것이다. 서술자 테이블에 SRV 추가 enum class CBV_REGISTER : uint8 { b0, b1, b2, b3, b4, END }; enum class SRV_REGISTER : uint8 { t0 = static_cast(CBV_REGISTER::END), t1, t2, t3, t4, END }; 다음과 같이 CBV, SRV의 레지스터를 enum class를 사용하여 묶어줬기 때문에 서술자 테이블에서 GetCpuHandle을 할 때, 해당하는 레지스터 값만 넣어주..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/JERK1/btsxp59UuR2/cBhWvVDIInkKwmzoA23oYk/img.png)
이번 글에서는 Mesh 클래스를 사용하여 간단한 오브젝트를 그려보고자 한다. 초기화 부분에서 정점 정보와 인덱스 정보를 넘겨주고 버퍼를 생성한 뒤 렌더링 함수에서 위 버퍼들에 대한 서술자를 셋 해주고 이동 관련 상수 버퍼를 업데이트하여 결과적으로 해당하는 메쉬에 대한 이동을 수행한다. 정점 정보는 디폴트 힙에 만들어야 한다. 일반적으로 모델링의 로컬 정점들은 변하지 않기 때문이다. 따라서 업로드 힙을 생성하여 정점 정보를 넘겨주고 업로드 힙의 내용을 디폴트 힙의 버퍼에 복사해야 한다. 이를 위해 편의용 함수를 구현한다. ComPtr d3dUtil::CreateDefaultBuffer(ComPtr device, ComPtr cmdList, const void* initData, UINT64 byteSize..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOapAA/btsxrk6tXjM/ursW0Rwn59DclzbIvA8en0/img.png)
이번 글에서는 쉐이더에 필요한 ConstantBuffer를 넘겨주는 방법과 [DirectX 입문]에서 배운 CPU와 GPU의 동기화 작업을 최적화하기 위한 수단인 FrameResource를 적용해보려고 합니다. 이에 대한 내용은 이전 글을 참고하면 됩니다. [Frame Resource와 Render Item] 01 Frame Resource Frame Resource 프레임 자원이란 프레임마다 명령 대기열을 완전히 비우지 않고 CPU와 GPU의 활용도를 높이는 최적화 수단이다. CPU와 GPU는 병렬로 작동하기 때문에 동기화가 필요하다고 suengho2257.tistory.com ConstantBuffer 상수 버퍼를 쉐이더로 넘기기 위해서 루트 시그니처를 사용해야 하고 이를 위해 루트 파라미터를 정의해..