본문 바로가기
게임 개발/[D3D_Portfolio] DirectX3D 팀 포트폴리오 작업일지

6. FBX 텍스쳐 매핑 & Toon Shading

by 헛둘이 2023. 7. 21.

FBX 텍스쳐 매핑

- FBX 텍스쳐 매핑은 FBX를 로드할 때 불러온 UV값과 텍스쳐를 통해 매핑된다.

- 이 작업을 할 때 특정 FBX 파일은 잘 읽어오는데 지금 사용해야하는 FBX는 제대로 읽어오지 못하는 버그가 있었다.

- 확인한 사항

1. 텍스쳐는 제대로 지정되어있었나? (O)

2. 그렇다면 그래픽스 디버깅에서 픽셀 셰이더에 SRV가 잘 매핑되었는가? (O)

3. 그렇다면 UV값이 정상적으로 매핑되었는가? (X) 

 

- 이 헤딩하는 과정을 통해 현재 Deferred Rendering에 의해 저장되는 Position, Normal, Color가 제대로 들어가는지와 해당 구간에 BP를 거는 등의 디테일한 작업을 몸소 익힐 수 있었다.

 때문에 컬러값이 아래와 같이 하나의 색상으로 찍히고 있었다.

픽셀 셰이더 값 추적

 

- 이런 문제가 발생한 이유는 uv를 가져오는 코드가 잘못됐기 때문이었다.

FbxVector2 uv = _pMesh->GetElementUV()->GetDirectArray().GetAt(_vertexCount);

- 위 코드를 아래와 같이 변경했더니 깔끔하게 해결되었다.

FbxGeometryElementUV* pUV = _pMesh->GetElementUV(0);
FbxVector2 uv = pUV->GetDirectArray().GetAt(_index);

 


Toon Shading

- 툰 셰이딩은 은비로운 개발일기(https://agh2o.tistory.com/21)에서 학습한 내용을 토대로 하였다.

- 빛이 물체에 닿아 적용되는 Diffuse 값은 람베르트 코사인법칙에 의해 빛의 휘도는 입사벡터와 해당 정점의 법선벡터의 내적을 통해 구할 수 있다.

- 여기서 결정되는 색상을 특정 구간별로 지정해놓으면 마치 만화에서 사용되는 음영을 적용시킬 수 있다.

ex)

0.0~0.3 -> 0.3

0.3~0.6 -> 0.6

0.6~0.9 -> 0.9

 

- Diffuse가 0~1 사이의 값이니 3을 곱하면 0~3 사이의 값이 된다.

- 여기서 구해진 값에 올림을 하게 되면 1~3 사이의 값을 구할 수 있는데 이걸 다시 3으로 나누게 되면

우리가 원하는 구간별로 구별되는 색상을 구할 수 있다.

 

float toonRatio = (ceil(diffuseRatio * 5) / 5.f);

color.diffuse = g_light[lightIndex].color.diffuse * toonRatio * distanceRatio;
color.ambient = g_light[lightIndex].color.ambient * distanceRatio;
color.specular = g_light[lightIndex].color.specular * specularRatio * distanceRatio;

-빛을 계산하는 부분에서 이렇게 세팅해주었다.

 

만화처럼 층이 진듯한 음영 완성

'게임 개발 > [D3D_Portfolio] DirectX3D 팀 포트폴리오 작업일지' 카테고리의 다른 글

8. Assimp 라이브러리 적용  (0) 2023.08.04
7. 충돌 구현  (0) 2023.07.25
5. FBX 로드  (0) 2023.07.20
4. Bloom 구현  (0) 2023.07.19
3. Particle System 구현 및 Bloom 구현 중  (0) 2023.07.18

댓글