될지 안될지 몰라서 일단 윗면만 메쉬들을 합해줬음.
되는거 확인했으니깐 나머지도 작업해야 할 듯
Greedy meshing
이건 사실 꽤 간단함.
내가 제대로 했는지는 모르겠지만, 일단 내가 한 방법은
블록 순회중
1. x+방향으로 최대한 합쳐주고,
2. 그 후에 합친 블록 전부에서 z+방향으로 추가가 가능할 때, z+방향으로 하나씩 나아가며 합쳐줌
1단계에서 5x1의 블록으로 합쳤다면,
2단계에서는 5x2 -> 5x3 -> 5x4 이런식으로 늘려줌.
합쳐진 블록은 "메쉬를 생성했음"으로 표시해주고, 윗면이였다면 그 블록은 앞으로 윗면 메쉬 생성을 하지 않음
나는 블록의 변형이 가능하기 때문에, 변형이 될 가능성이 있는 블록(4방향 옆에 하나라도 블록이 없다면)은 다른 블록과 합쳐지는게 불가능하도록 함
기존 코드에서 크게 고칠 부분도 딱히 없었고, 금방 한듯
텍스쳐 입히는게 문제였음
이 하나의 청크가
버텍스 단 4개!
텍스쳐 더러워지는건 밉맵 관련 문제라는데 산넘어 산인듯..
메쉬가 여러개가 하나로 합쳐졌기 때문에 단순히 텍스쳐를 입히면 한칸짜리 블록이 늘어나서 맨 윗 gif처럼 됨.
만약 uv가 0,0 ~ 1,1로 고정되는, 블록 하나당 텍스쳐 하나인 시스템이면 단순히 반복모드로 설정하면 된다고 함.
근데 텍스쳐 아틀라스로 하나의 큰 텍스쳐로 묶어서 등록시켜줬기 때문에 따로 쉐이더 내부에서 uv를 잡아줘야 했음.
진짜 쉐이더 1도 모르는데 어떻게든 해냄
유니티 처음했을 때 딱 이 기분이였던것 같음 ㅋㅋ
인터넷에 찾아보면 어차피 좌표 1마다 텍스쳐가 반복되야 하기 때문에 버텍스의 소숫점부분이 곧 uv좌표와 일치한다는 내용이 있었고, 이해는 했음.
근데 윗면일때는 버텍스의 x,z값으로 uv좌표를 구해야 하고, 옆면일때는 y,z 또는 x,z값으로 uv좌표를 구해야 하잖아
처음에는 if를 이용해서 구분했고, 사실 이대로 가도 됐을 것 같긴 함.
근데 다른부분에서 버그가 일어났는데, 나는 여기문제인줄 알고 이 방법을 포기하고 다른방법을 찾았음.
쉐이더에 입력되는 uv좌표를 이용해서 실제 메쉬(0,0 ~ 5,3)에서의 위치를 (0,0~1,1)사이의 비율 값으로 구함,
실제 메쉬크기와 크기가 같아지도록 조정하고 (0,0 ~ 5,3), 그 때의 위치의 소숫점 부분을 uv좌표로 사용했음.
그걸 위해서 uv좌표, 오프셋, 텍스쳐 크기, 합친 블록의 양 ex)5x3 이 정보를 모두 쉐이더에 보내줘야 했는데, 뭔가.. 이래도 되나 싶긴 함.
사실 정확히 어떤 값들이 오고가는지조차 모르겠어서 괜히 빙 돌아간것 같기도 함.
쉐이더만 6시간 잡고 있었는데 앓던 이가 빠진 기분임
좋은 방법 있으면 제발 알려줘 머리가 너무 아파
오 아이디어 ㅅㅌㅊ