일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 게임 프로그래밍
- InputManager
- Render Target
- Direct3D12
- direct3d
- DirectX12
- gitscm
- Deferred Rendering
- 직교 투영
- gitlab
- 장치 초기화
- 입방체 매핑
- 게임 디자인 패턴
- 게임 클래스
- 조명 처리
- DirectX
- FrameResource
- 동적 색인화
- TCP/IP
- 절두체 컬링
- 네트워크
- Frustum Culling
- light
- 노멀 맵핑
- effective C++
- Dynamic Indexing
- 디퍼드 렌더링
- C++
- 큐브 매핑
- 네트워크 게임 프로그래밍
- Today
- Total
목록DirectX (14)
코승호딩의 메모장
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/r0VXJ/btsyBgCfFOv/cmr6KWERn5VKzJlmJ7lLI1/img.gif)
이번 글에서는 큐브 매핑을 통해 텍스처를 하늘에 입히도록 한다. 큐브 매핑을 하는 방법은 다양하다. 우선 기존의 TEXTURE2D SRV를 사용하여 일반적인 텍스처를 구에 입히는 방법이 있다. 그러나 이번 구현에서는 보다 정확한 구현을 위해 TEXTURECUBE SRV를 사용하여 큐브 매핑을 하려 한다. Direct3D에서는 2차원 텍스처를 적용할 때와는 달리, 큐브 맵의 한 텍셀을 2차원 텍스처 좌표로 지칭할 수 없다. 따라서 큐브 맵의 한 텍셀을 식별하기 위해서는 3차원 텍스처 좌표가 필요하다. 이를 조회 벡터 v라고 부른다. 위 그림은 3차원을 간단하게 2차원으로 표현한 모습이다. 3차원에서의 텍셀은 원점에서 v의 방향으로 나아가는 반직선의 조회 벡터가 큐브 맵의 한 면과 교차하는 지점에 있는 것에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dyVulh/btsybRcvyvp/0vbhVxoXiyCMSNoOZh1klK/img.jpg)
이전까지는 조명을 통해 게임 세계를 좀 더 현실감 있게 렌더링 할 수 있었다. 그러나 아쉬웠던 부분은 메쉬에 텍스쳐를 입히면 노멀이 일정하기 때문에 똑같이 빛을 반사한다는 것을 볼 수 있다. 따라서 이번 글에서는 법선 벡터를 사용하여 로우 폴리곤의 그래픽 환경에서 하이 폴리곤의 입체감 및 질감을 구현하는 방법인 노멀 매핑에 대해서 구현한다. 더 나아가 거칠기(Roughness) 값을 단순히 머티리얼 당 상수 버퍼에 사용자가 지정한 값이 아닌 거칠기 맵을 활용 하여 적용하도록 한다. 법선 맵(Normal Map)은 하나의 텍스처에 각 텍셀에 RGB 자료를 담는 것이 아닌 압축된 x, y, z 좌표 성분들을 각 R, G, B 채널에 담은 텍스처이다. 성분당 8비트 총 24비트 이미지 형식을 저장한다고 하면 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/doEZu9/btsxH1Nbppx/qakyfMi73x24Can9mxYeI0/img.gif)
이번 글에서는 이전 조명 처리에서 아쉬웠던 부분을 보강하고자 한다. 목표는 패스 당 상수 버퍼에 카메라 정보를 넣어줄 것이고 머티리얼에서 거칠기, 프레넬, 분산 반사율 등을 실제로 사용하여 조명을 구현하고자 한다. PassConstants 이전까지는 ObjectConstants에 조명 작업에 필요한 view, viewproj, proj 정보 등을 넘겨 주었다. 그러나 이 카메라 정보들은 오브젝트 당이 아닌 한 프레임 당 업데이트가 일어나는 정보이다. 따라서 ObjectConstants와 PassConstants를 수정한다. struct ObjectConstants { Matrix matWorld; }; struct PassConstants { Matrix view = Matrix::Identity; Ma..
![](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 변환을 모두 넘겨주고 다음 글에서 패스(프레임) 당 상수버퍼를 새로 만들어서 따로 정보를 넘겨주도록 하겠다. 더 나아가 카메라를 두 ..