복셀 큐브 랜드 스케이프를위한 메시 최적화


12

Unity 3D (프로 시저로 생성 된 복셀 풍경)에서 마인 크래프트 / 레고 월드 풍경을 만드는 과정에서 이러한 풍경에 대해 생성 된 메시가 많은 메모리를 차지한다는 것을 알았습니다. 메쉬는 현재 큐브의 보이는면에 대한 꼭짓점만으로 구성됩니다. 복잡한 지형의 메모리 사용에는 6 백 ~ 7 백 메가가 걸릴 수 있습니다.

이 메시는 최적화 될 수 있지만,이를 수행하기위한 적절한 알고리즘을 찾기 위해 고심하고 있습니다.

알고리즘은 지형 유형이 다른 블록을 "병합"하고 싶지 않다는 점을 고려해야합니다. 정말 간단한 시작은 한 축을 따라 모든 블록을 처리하고 다른 두 축을 추가로 스위프하는 것입니다.

메쉬 모양을 유지해야합니다. 즉 빈 공간이나 단색 공간이 변경되는 지점에 꼭짓점이 병합되지 않습니다. 그 이유는 여전히 메시 주변을 탐색해야하는 생물 / 등이있을 수 있기 때문입니다. 디테일이 왜곡 된 메시를 만들 수는 없습니다.

이것에 대한 생각 / 제안 / 팁?


2
알려진 크기의 큐브에 꼭짓점을 저장하는 이유는 무엇입니까? 알고리즘 적으로 수행하십시오. 또는 공유 정점 버퍼를 사용하십시오.
감속

왜 다각형 메쉬입니까? 복셀은 마치 그대로 효율적으로 렌더링 할 수 있습니다 . 하나의 복셀 큐브의 경우 3 개의 플로트 (x, y, z)가 필요하고 1 개의 상자에는 8 * 3 개의 플로트 (8 개의 정점)가 필요하며 암시 적 가장자리와 다각형이있는 경우에 필요합니다. 어쩌면 Unity가이 복셀 문제의 도구가 아닐 수도 있습니다.
user712092

답변:


5

내 질문은 :

생물체 움직임을하기 위해 왜 메쉬 자체가 필요합니까?

id의 3 차원 행렬에서 경로 계산을 수행 할 수 없습니까?

Minecraft는 4 비트 pr 블록으로 3d 행렬을 사용한다고 생각합니다. 또한 플레이어 주변의 특정 반경에있는 생물 만 시뮬레이션합니다.

청크는 각 청크가 압축되는 oc-tree 구조로 저장할 수 있습니다.

압축 된 데이터를 RAM에 보관하면 필요할 때 데이터를 매우 빠르게 압축 해제 할 수 있습니다.

대체 텍스트


Unity와의 내장 충돌 감지를 위해 메시를 사용하는 데 의존했지만 사용자 정의 데이터 구조에 대한 충돌 / 경로 테스트를 막을 수는 없습니다. 그러나 지형을 표시하기 위해 여전히 보이는 메시를 만들어야하는데 이것이 최적화해야합니다.
제임스 리빙스턴

스크린 샷으로 볼 수 있듯이 또 다른 점은 평평한 지형이 많지는 않습니다. 메쉬는 일반적으로 큐브의 거친 표면이지만 메쉬면 / 정점을 최적화 할 공간이 있다고 생각합니다. "jaggy"데이터 대신 비슷한 데이터 블록이 많은 데이터에 대해 octree가 가장 좋은 것처럼 보입니다. 아니면 이것이 맞지 않습니까?
제임스 리빙스턴

@Gatorfrog : 빈 공간도 데이터입니다. 그것이 재기 있다면, 비어 있음을 나타내는 많은 비트가있을 것입니다. octree는 렌더링하기 전에 압축 해제해야하는 청크를 파악하기위한 것입니다. 빈 공간은 단지 0이 될 것입니다. 제 작업에는 매우 정교한 복셀 렌더링 라이브러리 작업이 포함됩니다. 다음 글은 그들이하는 일을 설명 할 것입니다.
일러

내가 작업하는 라이브러리는 다음을 수행합니다. 데이터 청크를 생성하여 플랫 파일 데이터베이스에 저장합니다. 각 청크에는 ID가 있습니다. 각 큐브는 많은 청크로 구성됩니다. 각 청크에 대해 특정 수준의 세부 수준이 생성됩니다. 최고 수준의 디테일이 복셀의 100 %를 차지하는 경우, 두 번째 최고 레벨은 모든 복셀의 25 %를 차지한 다음 각 후속 레벨에 대해 4로 나눕니다. 가까운 청크는 최고 수준의 세부 정보를 사용하여 시각화 할 수 있습니다.
일러

모든 데이터는 RAM에서 VRAM으로 압축 된 형태로 제공되며 CUDA에서 실행되는 GPGPU 압축 알고리즘에 의해 팽창됩니다. 이렇게하면 많은 메모리 대역이 절약됩니다. 따라서 : 플레이어가있는 곳에있는 detail (Check)은 그곳에서 높은 수준의 디테일 덩어리를 얻을 수 있습니다.
일러

1

옥트리를 사용하여 지형을 저장하는 것은 어떻습니까?

예를 들어 air = no node, 다른 모든 지형 유형에는 지형 유형이있는 노드가 있습니다.

노드를 삽입 / 제거 할 때 수정 된 트리 경로에서 각 노드의 8 개 하위 요소가 모두 동일한 terain 유형을 가지고 있는지 확인하고 필요한 경우 병합 할 수 있습니다. 이런 식으로 같은 재질의 큰 블록은 하나의 노드 만 차지합니다.


0

플레이어가 볼 수있는 지오메트리 부분에 대해서만 큐브를 작성하고 있습니까? 그것은 나의 첫 걸음입니다. 지형의 크기에 따라 월드 전체를로드 / 그리기 / 표시 / 무엇이든 가질 필요는 없습니다.


나는 옆에 빈 공기가있는 큐브의 측면에 대해서만 메쉬를 만들고 있습니다. 플레이어가 볼 수없는 메시를 그리지 않는 한 ... 지하 동굴이나 비스듬히 땅으로 이어진 구멍과 같이 눈에 띄는 블록이없는 덩어리는 제외하는 것을 생각했습니다. 그래도 그 시점에서 충돌 / 경로를 위해 메시에 의존 할 수는 없습니다.
제임스 리빙스턴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.