directX
[DirectX 11] Normal Mapping
Normal Mapping 개발 기간 : 2021년 5월 17일 ~ 2021년 5월 18일 Normal Mapping은 다음과 같은 과정으로 진행됩니다. 1. Normal Map 텍스쳐를 로드합니다. 2. Tangent Space의 TBN 벡터 중 T 벡터를 계산합니다. 이 때, 메쉬의 각 정점 v마다, 메쉬에서 그 정점을 공유하는 모든 삼각형의 T 벡터의 평균을 내서 vertex별로 T 벡터를 구합니다. 3. PS에서는 픽셀 위치에서 T와 N 벡터를 알고있고, 외적을 통해 B 벡터를 구합니다. 그리고, TBN 행렬을 구축해 Normal Map의 Tangent Space Normal값을 World Space로 변환합니다. 1. Normal Map 텍스쳐를 로드합니다. 확장자에 따라 DXTK 라이브러리에서..
[DirectX 11] Skinning Animation
Skinning Animation 개발 일자 : 2021년 5월 6일 업데이트 일자 : 2021년 12월 12일, FBX 포맷 지원하도록 업데이트 되었음 스키닝 애니메이션 과정은 다음과 같습니다. 1. ase 파일로부터 Bone 데이터 파싱 2. Animation 데이터 파싱 3. Animation Update하기 4. BoneTM 구하기 5. VS에서 vertex마다 BoneIndex, BoneWeight에 따라 BoneTM 곱하기 1. ase 파일로부터 Bone 데이터 파싱 본의 개수, 본의 이름, vertex의 bone index, bone weight를 파싱하고, 데이터를 저장해줍니다. 2. Bone List에 Bone Mesh의 Animation Data를 파싱해서 넣습니다. ase를 기준으로 ..
[DirectX 11] 외곽선
개발 일자 : 2021년 12월 21일 외곽선은 다음과 같은 두 가지 방식으로 개발했습니다. 1. 라플라시안 필터를 이용한 외곽선 출력 2. 뎁스 차이를 이용한 외곽선 출력 1. 라플라시안 필터를 이용한 외곽선 출력 픽셀 쉐이더에서 라플라시안 필터에 픽셀들을 필터링시켜 외곽선을 검출했습니다. float mask[9] = { -1, -1, -1, -1, 8, -1, -1, -1, -1 }; // Laplacian Filter float coord[3] = { -1, 0, +1 }; float divider = 1; float4 PS_Outline_Laplacian(VertexOut_RenderTarget pin) : SV_Target { float4 Color = 0; float4 Ret = 0; floa..
[DirectX 11] 파티클 시스템
개발 일자 : 2022년 3월 14일 ~ 18일 현재 제작 중인 일본 테마의 맵 중앙에는 이렇게 큰 냄비와 모닥불이 있습니다. 모닥불에는 당연히 불이 있어야될 것 같아서 파티클 시스템 구현을 시작했습니다. 구현 방식을 요약하자면 다음과 같습니다. 현재 파티클 리스트를 스트림 출력(Stream Output) 전용으로 그립니다. 래스터화기가 비활성화되어 있으므로 그 어떤 파티클도 화면에 렌더링되지는 않습니다. 기하 쉐이더는 주어진 조건에 따라 파티클들을 생성하거나 파괴합니다 (구체적인 조건은 구체적인 파티클 시스템에 따라 다릅니다. 불 파티클 시스템은 불.fx에 정의된 조건을 따릅니다.) 갱신된 파티클 리스트를 스트림 출력(Stream Output)을 통해 정점 버퍼에 기록합니다. 현재 프레임에 갱신된 파티..
[DirectX 11] Bloom
개발 일자 : 2022년 3월 7일 ~ 10일 지난 번에 창문으로 햇빛이 들어오는 효과를 위해서 Emissive를 개발했고 아트에게 Emissive Map도 요청해서 받았으나, 적용해보니 생각보다 느낌이 살지 않아 Bloom을 개발하게 되었습니다. 결과는 만족스럽게 나왔고 어떤식으로 개발했는지 살펴보겠습니다. 제가 참고한 Bloom 예시는 Halo3의 자료입니다. 이 자료에서 Bloom의 단계는 크게 9단계로 나뉩니다. 왼쪽에 Halo3 예시와 함께 제 엔진에서 적용된 화면을 같이 보겠습니다. 먼저, 원본 렌더타겟에 4x4 다운샘플링을 합니다. 그 후 Bloom Curve를 적용시켜 일정 밝기 이상을 추출해줍니다. 코드는 책과 Halo3 자료를 참고했습니다. float4 PS(VertexOut pin) ..
[DirectX 11] 자체 포맷 개발
개발 일자 : 2022년 2월 21일 ~ 25일 우리 팀 아트가 블렌더로 작업한 파일을 FBX파일로 익스포트하여 자체 엔진에서 임포트, 파싱하여 사용하고 있는데 문제점이 있었습니다. 첫 번째로 속도입니다. FBX파일을 임포트하고 FBX 파서에서 Triangulate 함수로 씬 내의 모든 노드를 삼각형화하는데, 이 과정에서 많은 시간이 소요됩니다. 또 FBX 익스포트 시에 특정 옵션을 주지 않는 이상 노말맵을 위한 탄젠트 스페이스를 임포트 과정 중에 구해야하는데, 이 역시 시간이 소요됩니다. 두 번째로 보안성입니다. 게임을 배포할 때 우리 팀 아트가 작업한 모델을 FBX로 익스포트해 그대로 사용한다면 이 FBX파일을 내 엔진 이외에 다른 엔진에서도 그대로 사용이 가능할 것입니다. 위의 두 가지 이유로, ..