일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Deferred Rendering
- InputManager
- 직교 투영
- 네트워크
- C++
- 디퍼드 렌더링
- 조명 처리
- 네트워크 게임 프로그래밍
- 절두체 컬링
- FrameResource
- DirectX12
- 게임 디자인 패턴
- 동적 색인화
- Frustum Culling
- 게임 프로그래밍
- Render Target
- 장치 초기화
- gitscm
- effective C++
- gitlab
- DirectX
- 입방체 매핑
- 노멀 맵핑
- 게임 클래스
- light
- Direct3D12
- TCP/IP
- 큐브 매핑
- direct3d
- Dynamic Indexing
- Today
- Total
목록전체 글 (44)
코승호딩의 메모장
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uFwOE/btsyVansPFW/KLGdJYNlEaakMnAEm3glFk/img.png)
이번 글에서는 Dynamic Indexing(동적 색인화)를 구현하기로 한다. 동적 색인화란 쉐이더 프로그램 안에서 자원 배열을 동적으로 색인화하는 것이다. 여기서 말하는 자원 배열은 텍스처 배열이다. 이 배열의 색인화에 사용할 수 있는 색인들은 다양한데 우선 상수 버퍼의 요소를 색인으로 지정할 수 있다. 그리고 시스템 밸류 값인 SV_PrimitiveID, SV_VertexID, SV_DispatchID, SV_InstanceID 등을 색인으로 사용할 수 있다. 또한 셰이더 안에서 계산한 결과를 색인으로 사용할 수 있으며 텍스처에서 추출한 값을 색인으로 사용할 수 있고 정점 구조체의 한 성분을 색인으로 사용할 수도 있다. 이렇게 자원 배열을 색인화한다면 다양하게 구현이 가능하다. 동적 색인화 개요 cb..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/k1teZ/btsyTqksjTX/yqsN68WkTFr3QpMgGJ5uhk/img.png)
이번 글에서는 프러스텀 컬링을 구현하려고 한다. 현재까지 월드 기준으로 변환을 진행하였으며 카메라 행렬을 기준으로 생성한 프러스텀을 뷰 변환의 역 변환을 통하여 월드 변환으로 변환한 후에 씬에 배치된 게임 오브젝트와의 충돌 처리를 통해 프러스텀 컬링을 구현해야 한다. 프러스텀의 각 면들을 수학적 계산을 통해 해당 오브젝트의 바운딩 박스가 충돌했는지를 구해야 하지만 DirectX12에서는 DirectXCollision.h를 통해서 바운딩 박스와 바운딩 프러스텀을 제공한다. 따라서 이를 사용해서 구현하기로 한다. class Camera : public Component { //... void GenerateFrustum(); bool IsInFrustum(BoundingOrientedBox& boundsOO..
![](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/cfYm0q/btsysrLk6eY/a8pZA7WsRuVLkJjuoMj2Dk/img.png)
01 스레드 기초 이번 글에서는 다수의 클라이언트를 독립적으로 처리하는 멀티스레드 기법을 사용한다. 이 전에 작성한 예제에서는 두 개 이상의 클라이언트가 서버에 접속할 수 있지만 서버가 동시에 두 개 이상 클라이언트를 서비스할 수 없다는 문제가 있으며 서버와 클라이언트의 send, recv함수 호출 순서가 맞아야 한다는 문제가 있다. 데이터를 보내지 않은 상태에서 양쪽에서 동시에 recv 함수를 호출하면 교착 상태가 발생할 수 있다. 결국 두 프로세스는 recv 함수에서 빠져나가지 못하게 된다. 서버가 동시에 두 개 이상 클라이언트를 서비스할 수 없다는 문제 해결책 1: 서버가 각 클라이언트와 연결하여 통신하는 시간을 짧게 줄인다. 즉, 클라이언트가 데이터를 전송하기 전에 매번 서버에 접속하고 전송 후 ..
![](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..