2011-09-23 7 views
0

WebGL에서 버텍스 셰이더에서 움직이는 동적 표면이 있습니다. 나는 다른 물체가이 표면과 상호 작용하기를 원한다. (예를 들어, 동적 인 지형에 타는 물체). 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 이 모든 계산을 CPU에서 수행해야합니까? 이 물건을 GPU로 계산할 수있는 방법이 있습니까?WebGL 지오메트리 상호 작용

기본적으로 바라는 것은 다른 (이미 변형 된) 꼭지점에 액세스 할 수있는 꼭지점 셰이더입니다. 완벽 할 것입니다.

답변

1

불행히도 셰이더에서이 작업을 수행 할 수 있을지 확신하지 못합니다. 내가 생각할 수있는 가장 가까운 것은 두 번째 속성 집합 인 을 전달하는 것입니다. 그러나 꼭지점 수는 동일해야하며 한 모델의 하나의 꼭지점을 다른 모델의 동일한 인덱스를 가진 꼭지점에 대해서만 유효성을 검사 할 수 있습니다 (왜냐하면 당신은 그들 모두를 통해 반복의 방법이 없습니다). 여하튼, 나는 이것이 당신이 찾고있는 것이라고 생각하지 않습니다.

가장 좋은 방법은 CPU에 이러한 종류의 것들 (충돌 감지 등)을 구현하는 것입니다. 자바 스크립트는 매우 느리고 장면에 사용할 최상의 알고리즘에 대해 오랫동안 고민해야 할 필요가 있습니다.하지만 실제로 생각할 수있는 유일한 방법입니다.

공간 분할을 사용하는 것이 좋습니다 (예 : octree, BSP -- binary space partitioning -- tree). 나는 벤치마킹을 한 적이 없지만, BSP 트리는 대부분의 JavaScript 장면에서 octree보다 효과적 일 것입니다. 일반적으로 전체 검사를 수행하는 검사가 적고 잠재적으로 훨씬 적은 재귀가 발생합니다. 또한 BSP 트리를 사용하면 형상을 계속 정렬하고 다시 정렬 할 필요없이 공간의 임의의 점에 대해 백 - 투 - 프런트 또는 프론트 - 백으로 지오메트리를 처리 할 수있는 거의 유일한 기능을 제공합니다. BSP 트리의 단점 (및 더 작지 만 여전히 중요하지 않은 정도)은 그 지오메트리가 정적으로 유지되어야한다는 것입니다. 즉,이 트리를 사용하여 모든 삼각형을 즉시 움직이는 것은 불가능합니다. 을 다시 정렬해야하기 때문입니다. 메시의 애니메이션이 상대적으로 단순하고 예측 가능하며 (예 : 바람에 흔들리는 깃발과 같은) 공간 분할의 정적 특성이 특히 까다로운 문제라고 생각하지 않지만 복잡한 경우 (예 : 무너지는 건물 또는 떨어지는 암벽), 이러한 유형의 공간 파티션은 전혀 사용할 수 없습니다.

업데이트 : 모델이 풍차 (타워가 정적이고 핀이 동적 인)와 같이 부분 정적 및 부분 동적 삼각형으로 구성되어있는 경우 정적 부품에 공간 분할을 사용할 수 있으므로 동적 삼각형에 대한 불필요한 성능 저하를 방지하고 너무 많이 움직이지 않는 삼각형에 대한 공간 분할의 이점을 얻으십시오.

업데이트 : 사실, 적어도 부분적으로는 쉐이더에서 "다소"할 수있는 한 가지 방법이 있습니다. 특히 동적 인 지형을 타고있는 오브젝트의 예를 들어 보면, 동적 인 지형을 오프 스크린 프레임 버퍼로 렌더링 한 다음, 오브젝트의 위치를 ​​동일한 프레임 버퍼에 플롯하고, readpixels()을 사용하여 지형의 높이를 읽습니다. 그 위치. 이것은 높이 맵에만 적용되며 지형이 바뀔 때마다 프레임 버퍼가 업데이트되어야합니다. 그러나 CPU에서 지형 생성 자체를 수행하지 않고도 동적 지형에서 물체를 얼마나 높이 배치해야 하는지를 비교적 간단하게 파악할 수 있습니다. 이것은 실제적인 충돌 탐지가 아니며, 물체는 여전히 다른 문제 (예 : 한 바퀴가 지형 위나 아래, 한 바퀴가 공중에있는 것처럼)의 영향을받습니다. 이러한 문제를 해결할 수는 있지만 솔루션은 중요하지 않습니다. 아마 프레임 버퍼 데이터에 대해 여러 번 검사해야 할 것입니다.