이점을 잃지 않고 형상 / 메시 병합


11

three.js에서는 단순히 도형을 병합하여 그리기 호출의 양을 제한하여 성능을 향상시킬 수 있습니다. 하나의 재료로 간단한 테스트를 통해 GTX660 GPU에 60fps에서 50.000 큐브 + 그림자를 그릴 수 있습니다. 지오메트리 병합없이 5.000 큐브는 이미 문제를 일으켰습니다.

각 큐브 메쉬를 자체 렌더링하는 이점을 유지하는 방법이 궁금합니다. 예를 들어, 모든 것이 하나의 지오메트리로 병합 될 때 큐브 메쉬를 선택하는 방법은 무엇입니까? 기본적으로 그것은 불가능합니다.

이 문제에 대한 일반적인 기술이 있습니까? 결국 병합 후에도 병합되지 않은 메쉬 객체가 모두 있습니다. 따기 위해 활용하는 방법이 있어야합니까?

간단히 말해서하고 싶은 것

  • 학습 목적을위한 게임과 같은 심시티
  • 각 집은 큐브 메쉬입니다
  • 50.000 집을 렌더링하고 집을 추가 및 제거 할 수 있기를 원합니다
  • 마우스 커서를 통한 집 선택 (피킹)이 가능해야합니다

이것이 당신에게 사용되는지 확실하지 않지만, 완전성을 위해 언급합니다. Simplygon 은 인디 개발자를위한 로열티 기반 가격 책정 모델 을 가지고 있으며 디자인 타임에이 메쉬 병합 및 파티셔닝을 수행 할 수 있습니다.
steeveeet

답변:


11

알았어 전체 지오메트리를 병합 한 후에도 여전히 개별 메시가 배열로 유지됩니다. 따라서 렌더링되지 않더라도 레이 캐스팅에이 메시를 사용할 수 있습니다. 이것을 깨닫기 위해 시간이 걸렸습니다.

여기에 이미지 설명을 입력하십시오

선택을 위해이 octree 구현을 사용합니다 : http://threejs.org/examples/#webgl_octree_raycasting

업데이트 당 교차 테스트가 50.000에서 ~ 500으로 줄어 듭니다. 옥트리가 없으면 fps가 크게 줄어 듭니다.

주황색 피킹 선체는 실제로 재질이 변경되고 크기가 변경된 이제 렌더링 된 메시 (+1 드로우 콜)입니다.

여기에 이미지 설명을 입력하십시오

다음 단계는 일종의 맵 파티셔닝을 구현하는 것입니다. 즉, 병합 된 형상을 여러 조각으로 나눕니다. 병합 된 지오메트리에 많은 정점이 있기 때문입니다. 즉, 맵을 화면에서 99 % 밖으로 이동해도 지오메트리가 아직 보이지 않기 때문에 그래픽 카드는 여전히 모든 정점을 처리해야합니다 (최소 1 %). 따라서 그것이 깨지면, 보이는 조각들만 렌더링되어야합니다.


이 통찰력에 감사드립니다. 나는 이것을 할 수있는 방법을 찾으려고 노력했으며 여기에 귀하의 솔루션이 가장 훌륭하다고 생각합니다! 빠른 질문 : 로컬 객체 목록 (예 : Three.Object3D)의 경우 rayCaster.intersectObjects ()가 작동하려면 어떤 종류의 속성이 필요합니까?
AlvinfromDiaspar

아주 잘 했어요
ClassicThunder

비슷한 문제가 있지만 어떻게 든 r70으로 광선 투사 작업을 수행 할 수 없습니다. 상자를 만들고 병합하는 동안 특별한 작업을 했습니까? 다음 코드 ( pastebin.com/PStaAF3P )를 사용하여 노드를 만들고 병합하지만 레이 캐스터를 작동시키기 위해 누락 된 것이 있습니까?
fhahn

빠른 질문 : 나는 당신과 매우 비슷한 일을하고 있습니다 (geoJSON 데이터를 기반으로 한 3D지도). 방법을 사용하면 카메라를 회전 할 때마다 기존 건물 메쉬도 회전해야합니까? 아니면 장면에 개별 상자를 추가하지만 렌더링하지 않습니까?
Spencer

@Spencer 회전 할 필요가 없습니다. 개별 상자를 전역 배열로 유지하고 병합 된 형상 만 장면에 추가합니다. 레이 캐스터는 카메라 매트릭스와 각 상자 위치에 따라 달라 지므로 전역 배열의 객체로 레이 캐스팅을 수행 할 수 있습니다. 가장 좋은 방법은 아니지만 이것은 단지 개념 증명이었습니다. 이 시점에서 더 이상 three.js를 수행하지 않습니다.
user990827

1

선택을 위해 각 큐브의 ID를 다른 렌더 대상으로 렌더링하고 커서의 ID 값을 확인하면됩니다. 선택은 픽셀 완벽하고 더 복잡한 형상에도 효율적으로 작동한다는 것입니다.

모든 객체의 형상이 동일한 경우 인스턴스 렌더링을 사용할 수 있습니다. 한 스트림은 지오메트리를 정의하고 다른 스트림은 인스턴스 당 속성을 정의합니다 (예 : 변환). 절두체 컬링의 경우 가시성 테스트를 기반으로 각 프레임마다 인스턴스 스트림을 빌드해야합니다. 많은 양의 개체가있는 경우 느슨한 개체 나 컬링 속도를 높이기 위해 해당 개체를 배치 할 수 있습니다.


0

three.js의 세부 사항에 대해 잘 모르겠지만 일반적인 OpenGL에서 두 가지 가능한 성능 호그가 떠 오릅니다.

  1. 인스 턴싱을 고려 ​​했습니까? 하나의 드로우 콜만 필요하며 VRAM을 더 적게 사용합니다.
  2. 피킹 알고리즘을 진지하게 살펴 보셨습니까? 예를 들어 큐브가 트리 대신 목록에 경계 볼륨이있는 경우 해당 크기의 차이를 설명합니다.

0

또 다른 접근 방식은 지오메트리에 일부 정점 속성을 작성하고 조각 논리에 강조 논리를 넣는 것입니다. 이 기능은 메모리에 두 개의 데이터 사본을 갖고 싶지 않을 때 매우 유용하며 하이라이트가 구현되는 방식을 더 잘 제어 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.