본문 바로가기
DirectX/[갠플] Maple Story 모작

22-09-04

by GameStudy 2022. 9. 4.

1. 오늘 배운점/느낀점

 

2. 엔진 구현 사항

  2-1. 알파 블랜딩

    - 캐릭터 텍스쳐가 있는데, 캐릭터 텍스쳐 속 알파값이 0인 부분이 있다면,

      또 해당 부분의 z값이 0에 가깝다면? 물체가 배경과 텍스쳐 사이에 그려진다면 

      해당 텍스쳐가 짤려나갈 수 있음. 알파 커버리지 기법이 필요해짐. (ex. 나뭇잎 랜더링)

  2-2. 광원

    - 광원의 종류: Directinal Light, Point Light, Spot Light

    - Ray Tracing: 기존의 광원 효과보다 연산량은 많으나, 현실적인 그래픽 랜더링 가능.

    - Directional Light: 빛의 방향이 정해져있다라고 생각함. 그러나, 실제와는 다르게, 방향을 결정하기 어렵긴함.

      다만, 태양과 같은 아주 먼 곳에서 빛이 온다면 방향을 결정하는게 맞음.

      또는, 태양계 단위의 스케일에선 Point Light로 하는게 맞음. 방향이 모두 다르기 때문.

      즉 상황에 따라 상대적으로 결정함.

    - 빛을 받아서 밝아지는 것은 어떻게 구현할까.

      디자이너 들은 텍스쳐를 만들때, 빛을 최대로 받은(광원과 굉장히 가까운) 텍스쳐를 만듦.

      물체 단위 표면에 수직한 벡터(노말 벡터)를 구하고, Directional Light 벡터와 내적한 값만큼 강도를 결정하면 됨.

      만약 노말벡터와 Light 벡터가 0도를 이룬다면 반대로 값이 1로 되기에 그땐 강도를 낮춰버림.

    - 로컬 스페이스에서 구해진 노말벡터의 방향은 그대로 광원 효과에 쓰면 안됨. 

      월드 행렬으로 곱해지면 회전이 이뤄질 수 있기 때문에 물체회전시 노말벡터의 방향도 바뀌어야함.

      다만, 노말벡터는 방향벡터기 때문에 w를 0으로 둬야함. 즉, 회전만 이뤄지고 이동은 영향을 받지 않음.

      그런데 아직 크기는 영향을 받기 때문에, 월드 행렬이 곱해지고 난 후에는 노말라이즈가 필요해짐.

    - 이제 월드 노말벡터와 광원 방향벡터를 알 수 있음.

      빛의 세기를 결정해야하는데, 이를 정점 단위로 계산할건지 픽셀 단위로 계산할건지가 중요해짐.

      정점 단위로만 계산해서 정점에 빛의 세기를 담아두면, 레스터라이져에선 보간해서 픽셀단위로 결정해줌.

      이때 보간은 선형보간임. 그래서 각진느낌이 남. 따라서 정확한 느낌을 원하면 픽셀 셰이더에서 빛의 세기 구함.

      즉, 정점의 노말 벡터를 PS로 넘기면, 각 픽셀별로 노말벡터가 보간됨. 따라서 PS에서 이를 계산.

      다만, 뷰 공간의 노말벡터를 구해서 넘기도록 함.

    - Ambient: 난반사되어서 물체의 뒤편도 어느정도 보이게끔 하는 방법.

      다만 내적의 결과를 0에서 1사이로고정해줘야함. 음수로 떨어져서 Ambient의 효과가 사라질 수 있기 때문.

    - 반사광: 반사광을 Vr이라고 하면, Vr = Vl + 2* (-Vl * Vn)

      다만, 이 반사광의 방향은 카메라 방향으로 되돌아와야함.

      즉, 내 눈에서 나오는 방향벡터를 구해내야함.

      다만 반사광은 입사빛의 색이 그대로 눈에 들어오기에, 물체의 색이 필요없음.

      또한 입사빛의 30프로 정도만 눈에 들어오게 조절. 

      그러나 여기까지만 해줘도, 대부분으 ㅣ지점이 반사광 영향을받음.

      따라서 승수를 줘서, 각도가 살짝이라도 틀어지면 반사광의 영향을 받지 않게끔 함.

  2-3. 노말맵핑

    - 각 정점에는 UV 정보도 갖고 있음. 그 UV 정보를 VS가 PS로 넘기면, 해당 정보도 보간되어짐.

      어떤 때는 정점안에 뿐만아니라, 텍스쳐 안에 UV 정보가 있는 경우도있음.

      해당 UV 정보를 가져오면 물체 텍스쳐에선 픽셀 색상, 노말 텍스쳐에선 노말벡터가 나오게됨.

      다만 이때 노말 텍스쳐는 해당 매시 물체에 올바르게 그려져 잇어야함. 구면 구안쪽으로 들어가는 노말벡터는 안됨.

      다만 로컬 공간에서 매시 물체가 포징을 해버리면 노말 벡터는 쓸모없어짐. 그래서 노말벡터가 상대좌표로 되어야함.

      노말 벡터는 하나인데, 물체의 표면의 노말벡터 기준으로 노말 텍스쳐 속 노말 벡터가 움직이게 됨.

      그래서 상대 노말 텍스쳐는 B 계열의 텍스쳐임. 절대 노말 텍스쳐는 무지개색임.

      마치 그림인데 어두운 구멍을 그리면, 사람들이 속아버림. 결국 종이에 그려진 구멍인데도 실제 구멍처럼 보임.

      이는 명암을 줘서 구현해내는 것. 

    - 근데 노말 맵핑없이 울퉁불퉁한 느낌을 주려한다면, 정점 수를 많이 늘려야함. 그럼 최적화가 안됨.

      따라서 노말 데이터의 텍스쳐를 하나 더 만들기만 하면 정점 수를 늘리지 않아도됨.

      그럼 원래 정점의 노말 정보는 필요없나? 아님. 뷰 공간의 노말 정보를 만들기 위해 필요함.(???)

 

3. 컨텐츠 구현 사항

  3-1. 인벤토리 아이템 이미지 버그 픽스

  3-2. 퀵슬롯 드래그 드랍

    - 퀵슬롯도 하나의 인벤토리로 간주함.

      인벤토리의 개수가 연동되게끔 함.

    - 그런데 문제는, 인벤토리 켜야지만 인벤토리의 업데이트가 돌고

      인벤토리의 업데이트가 돌지않으면, 퀵슬롯의 개수도 동기화되지 않음..

      엔진 프로그래머분께 요청드려서 보이지만 않는 기능을 만들어야 할듯.

    - 라고 생각했지만, 랜더러만 Off()해서 해결함.^^7

  3-3. 퀵슬롯 아이템 사용

    - 일단 delete키와 insert 키만 만들고자함. HP / MP 두개.

      추후에 추가할때 쉽게 가능하도록 설계해둠.

  3-4. NPC 물약 상점

    - NPC와 npc 애니메이션 구현

    - 클릭 시 상점 UI 랜더링

  3-5. 레벨업

'DirectX > [갠플] Maple Story 모작' 카테고리의 다른 글

22-09-06  (0) 2022.09.06
22-09-05  (0) 2022.09.05
22-09-03  (0) 2022.09.03
22-09-02  (0) 2022.09.02
22-09-01  (0) 2022.09.01

댓글