Normal = 법선벡터 한 평면이나 직선에 대하여 수직인 벡터
지형 컴포넌트
지형은 텍스처와 높이텍스쳐 이렇게 두개가 있으면된다.
높이텍스쳐는 지형의 높이를 나타내주는 텍스쳐이다.
가로개수, 세로개수, 한칸의 가로세로크기를 사용 (격자형태)

1. 이 높이텍스처를 뽑아올때 Image에서 가로세로 전부 돌려주면서 Pixel값을 가져온 후, 이 값을 저장해둔다. (높이)
0~255값이 나오므로 /60.f를 해주었음 (임시)
없으면 값이 없는상태로 가로세로만큼 초기화를 해두면된다
2. 버텍스 정보를 만들어준다.
버텍스정보는 사각형 격자형태로 한다면 삼각형 두개를 그리면 되므로
이 정점정보들을 x,y 몇번째에 맞춰서 삼각형을 그려준다.
UV값은 x값은 x변 몇번째에서 전체x값-1을한 값, z도 똑같이 해서 값을 구해준다.
Normal은 0,0,0 나중에 구해준다.
y값이 서로 달라져서 올라오게되서 Normal이 달라질 수 있다. (면의 법선)
아래와같은 방법으로 법선벡터를 구한다.

UV 이미지 한개로 덮어씌우면 이미지가 늘어난다.
이미지 타일링해서 집어넣을것
//이미지 타일링은 이미지를 타일 형태로 조각내어 화면에 로딩하는 방식을 의미합니다.
기본 UV는 꽉차게 깔아놓고 타일링을통해 늘림
ex) 가로는 128이라면 127까지 존재 해서 j/128-1 세로도 똑같은방법을 나눔
Tangent는 x축이니 x만 1
Binormal은 y축인데 반대로 그려먀되므로 -1로 해준다. 그래서 Z축
x축으로 90도 회전된상태라고한다.
잘 모르겠다.
m_vecFaceNormal 리사이즈 원리

3. 인덱스 정보를 만들어준다.
삼각형은 두개로 만들어주는데
우상단 삼각형으로 한개 좌상단 삼각형으로 1개씩 구해준다.
그다음 두개의 벡터를 만들어준다 Pos[1]- Pos[0], Pos[2]-Pos[0]
이 두개를 외적한 벡터를 구해준다. (왜?)
삼각형이 두개이니까 두개를 구해준다.

인덱스 구하는 방법

4. Normal값을 구해준다.
i*3 하는 이유 인덱스개수가 3이라서
Index0 m_vecIndex[i*3]
Index1 m_vecIndex[i*3+1]
Index2 m_vecIndex[i*3+2]
여기에 법선으로 구해놓은값을 더한다.
이것을 노말라이즈하면은 법선평균이된다.
5. Tangent값을 구해준다.
설명이없었음 코드는 있음..ㅠㅠ UV를이용해서 구하는 방식 이외메모는없다.
6 메쉬를 만들어준다.
만들기
1. 머티리얼 만들어서 텍스처, 링크 걸어주기
fx 생성
LandScapeCBuffer 상수버퍼 만들어줌
디테일레벨(화질)을 올려주기위해 사용
UV에 곱하면 화질이 올라간다.
TextureArray를 만들어줘서 여러개의 텍스처들을 넘겨줘서
지형을 만들어준다.
지형을 추가하는곳은 MainScene CreateMaterial에서 다 추가를 해주었음
Albedo
지형텍스처
Normal
Specular
Alpha 3개를 넣은 이유
베이스텍스처를 다 깔고나서 AlphaTexture를 사용해서 어느부분에 그릴것인지 사용하기(지도)
텍스처 색농도에 따라 맞춰서 적용이된다.
(진한거에서 연한부분 블렌드처리를할것)
재질들을 다 넣었는데(5개씩) 마지막에 알파만 3개를 넣어놓았다.
이유 : 기본 베이스 텍스처를 다 깔아놓고나서 알파텍스처에 맞추어서
어떤부분은 1번 어떤부분은 2번 어떤부분은 3번 이렇게 배치하려고 하는것이다. ?
섞이는 농도 또한 섞이는거에 따라서 작업을 할것이다. ?
마우스를 클릭했을때 사각형을 찾을때 높낮이 체크할땐 지형피킹을 할경우 마우스가 바라볼때 직선을 만들어내서 직선을 통과하는 삼각형만 걸러내줘서 부딪힌것을 체크하는것?
이것을 DDT라고한다
직선알고리즘으로 "브레젠험 알고리즘" 이것을 하는게 좋다.
구현하려면 공부하기 (맵툴용)
LandScape.fx에다가 ArrayTexture를 가져와야한다.
MinMap에다가 여러장의 텍스처를 넣어놓은것들
UV.는 픽셀에서 만들어주기
기본베이스는 디퓨즈 노말 스페큘러에 넣어놓자
스플레팅텍스처에따라서 새로 만들어줘야되서 기존에 만들어줬던 BumpNormal을 새로 만들어주기 (FX)
베이스컬러에서는 알파는 사실 지형은 반투명하면 안된다.
그래서 반투명처리는 하지 않을것이다.
디퓨즈컬러를 먼저 꺼내온다.
Count개수만큼 처리가 되고있기 때문에
일단 스플래팅갯수만큼 반복을 돌리고 SplatAlbedo는 Array에서 꺼내올텐데 UV좌표는 3개가필요하다.
DetailUV,i 요렇게
텍스처가 여러장이 array로 들어가있기 때문에 기본 UV정보와 몇번째것을 꺼내올건지가 필요하다.
g_SplatAlbedo.Sample(샘플러, float3(UV, 텍스처번호)
알파텍스처는 전체 맵에다가 영향을 주게끔 만들거라고 했었다. 디테일 UV를 구했고 전체 UV는 input.UV이다. 그래서 이녀석을 사용해야한다.
이후 알파블렌딩공식을 이용해서 기존 베이스컬러에 컬러농도를 가지고와서 사용
범프노말은 랜드스케이프 따로 해주어야됨
노말처리해주는것도 위방식으로 처리
스펙큘러도 위방식으로 처리
이렇게 섞어서 처리해주는방식을 "스플래팅"이라고 한다.
'공부 > DirectX' 카테고리의 다른 글
| DirectX Ray 피킹 (0) | 2022.01.24 |
|---|---|
| DirectX 3D 지형타기 (0) | 2022.01.22 |
| DirectX 자원뷰의 종류 (0) | 2021.12.15 |
| Texture (0) | 2021.09.28 |
| UI 구조 (인게임) (0) | 2021.09.27 |