사기성 컬링 (2/2) |
| programming/graphics 2003/01/24 05:33 |
이번에는 마지막으로 AABB 그룹을 이용해서 컬링한 것을 적어봅니다.
기본적으로 화이트데이에서는 BSP를 활용한 것과 별개로 AABB 영역을 설정해서 그룹 별로도 관리 했습니다.
오브젝트가 렌더링 해야 된다고 판단되었을 때 그 오브젝트가 속한 그룹이 보일 가능성이 없는가를 판단하는 곳에 사용되었습니다. (내부적으로는 점진적 로딩-출시 때는 항상 off 였습니다만...-등에도 사용했습니다.)
이런 식으로 VIS 그룹을 사용했을 때의 가장 큰 이점은 적은 연산으로 많은 오브젝트에 대해 가시성 테스트를 할 수 있다는 점입니다.

VIS그룹은 영역 테스트가 용이한 AABB 로 만들었습니다고, 첫번째 사기성 포탈을 포함한 가시성 체크 루틴은 아래처럼 수정되었습니다.
A. PVS 에 의하면 보일 가능성이 있는 위치에 있는 가 ?
B. Vis 그룹이 보일 가능성이 있는 가 ?
C. 절대 포탈을 통해 보이는 가 ?
D. View Frustum 안에 있는 가 ?
E. 렌더링 시도
먼저 Vis 그룹이 보일 가능성이 없는 가는 1차적으로 View Frustum 과의 검사를 통해서 할 수 있습니다. 당연한 얘기지만 View Frustum 밖에 있다면 렌더링 될 가능성이 없겠죠. (그림에 A, B 그룹은 모두 보인다고 판단할 수 있겠네요.)
Vis 그룹은 AABB 로 만들었기 때문에 처리상 연산을 줄이는 이득이 있었습니다.
화이트 데이 에서는 카메라와 Vis 그룹과의 거리를 검사해서 적당히 멀리 있을 경우에는 렌더링 하지 않도록 했습니다. 기본적인 frustum 컬링을 통해서 판단할 수 있지만 워낙 오브젝트가 많아서 화이트 데이에서는 가시 거리에 있어도 멀리 있는 경우에는 렌더링 하지 않게 설정했습니다. (개발 중에 세팅을 잘못해서 비교적 멀지 않은 거리에서 오브젝트가 사라졌다 나타났다 한 적이 있는 데, 그 자체가 무서웠다는 반응도 있었던 기억이 나네요.^^)
그리고 문이 닫겨서 Vis 그룹이 완전히 외부로 부터 차단된다고 판단되는 것들은 따로 관리를 했습니다. 문마다 노가다로 Vis 그룹을 설정해서 문이 닫기거나 열리면 Vis 그룹에 프래그를 바꾸도록 스크립트로 작성해두었습니다. 만약 그림의 B 와 같은 경우도 문이 닫겨 있다면 보일 가능성이 없다고 판단할 수 있겠죠.
화이트 데이의 경우 교실마다 창문이 있기 때문에 문으로 완전히 안보이는 설정은 맞지가 않아서 아예 교실안을 문이 닫겼을 때 보이는 영역과 그렇지 않은 두 영역으로 분할해서 별도로 처리했습니다. 그래서 바닥쪽의 Vis 그룹은 이 설정이 적용되도록 만들었습니다. (책상, 의자 등이 해당되는 데, 수가 많은 편이라 꽤 큰 이득이 있었습니다.)
그리고 카메라의 중심점이 vis 그룹 안에 있으면 조건에 상관없이 보일 가능성이 있다고 판단할 수 있습니다.
이 경우는 다른 조건들은 모두 무시합니다. (교실안에선 문이 닫겨 있다고 해서 안 그려도 된다는 판단을 할 수는 없겠죠.)
1. 카메라의 중심점이 그룹안에 있는가 ? (yes -> 보일 가능성 있음)
2. 문이 닫겨서 보일 가능성이 없는가 ?
3. 멀리 있어서 보일 가능성이 없는가 ?
4. View Frustum 영역을 벗어나 보일 가능성이 없는가 ?
화이트 데이는 속도를 고려해서 위의 순서로 가시성 체크를 했습니다.
마지막으로 제목에서 암시한 포탈을 응용한 두번째 사기성 컬링 체크를 추가해주면 됩니다.(역시 사기에 가깝지만, 나름대로는 게임 레벨의 특수성을 활용다고 변명을... ^^)
그림을 봤을 때 A 그룹은 벽이 가로 막혀 있기 때문에 렌더링 되지 않는 것이 맞겠죠 ? 마지막 방법은 이걸 판단하는 것입니다.
기본적으로 그림과 같은 2d 라고 할 경우 임의의 위치에서 vis 그룹이 보이는 것은 왼쪽, 오른쪽, 위, 아래면을 통해서 일겁니다. (여기에 면은 무한 평면이 아니라 정점 4개를 가지는 사각면입니다.)
여기에 Vis 그룹별로 벽에 해당되는 면을 프래그가 있다면 그 면을 통해서 볼 수 있는 지 체크할 수 있습니다.
그림의 경우 A 그룹은 위, 아래, 왼쪽은 벽이기 때문에 오른쪽 면만 보일 수 있다고 판단되겠죠. 이 오른쪽 면을 일종의 포탈이라고 판단하면 포탈이 화면에 렌더링 될 가능성이 있는 지로 가시성 테스트를 할 수 있습니다. 그래서 그룹 A는 빨간선에 해당하는 오른쪽 면이 시야에 없으므로 그룹 A는 렌더링 될 가능성이 없다고 판단될 것입니다.
3차원으로 확장할 때 면이 6개가 된다는 것 외에는 차이점이 없다고 할 수 있습니다.
만약 그림에서 벽이 다 유리라고 가정한다고 해도 A의 왼쪽면을 통해서 그룹 A가 보일 가능성은 없을 것입니다. 벽의 노말과 카메라의 시야와 관계를 생각해보면 적용할만한 좋은 아이템이 생각나실 겁니다. backface culling 이죠.
A. 벽면이 아니라 포탈에 해당하는 면인가 ?
B. view 에서 봤을 때 해당 면이 카메라를 향하는가 ? (backface culling 응용)
C. 해당 면이 화면 안에 있는가 ?
그래서 각 6개의 면을 위처럼 체크하는 것으로 그 VIS 그룹이 보일 것인지 아닌지를 판단할 수 있습니다.
체크하는 방법은 어느 정도 레벨의 특성에 기인한 방법이긴 하지만 Vis 그룹이 포탈을 통해 보이는 가를 판단하는 일반적인 개념과는 동일한 모양입니다.
이상이 두가지 컬링에 대한 것입니다. 이번에 적은 vis 그룹과 관련된 것들은 상당히 효과가 있었습니다. (vis 그룹이란 말은 그냥 제맘대로 붙인 것이니 용어 자체에는 의미 두시 마시길... T_T)
기본적으로 화이트데이에서는 BSP를 활용한 것과 별개로 AABB 영역을 설정해서 그룹 별로도 관리 했습니다.
오브젝트가 렌더링 해야 된다고 판단되었을 때 그 오브젝트가 속한 그룹이 보일 가능성이 없는가를 판단하는 곳에 사용되었습니다. (내부적으로는 점진적 로딩-출시 때는 항상 off 였습니다만...-등에도 사용했습니다.)
이런 식으로 VIS 그룹을 사용했을 때의 가장 큰 이점은 적은 연산으로 많은 오브젝트에 대해 가시성 테스트를 할 수 있다는 점입니다.

VIS그룹은 영역 테스트가 용이한 AABB 로 만들었습니다고, 첫번째 사기성 포탈을 포함한 가시성 체크 루틴은 아래처럼 수정되었습니다.
A. PVS 에 의하면 보일 가능성이 있는 위치에 있는 가 ?
B. Vis 그룹이 보일 가능성이 있는 가 ?
C. 절대 포탈을 통해 보이는 가 ?
D. View Frustum 안에 있는 가 ?
E. 렌더링 시도
먼저 Vis 그룹이 보일 가능성이 없는 가는 1차적으로 View Frustum 과의 검사를 통해서 할 수 있습니다. 당연한 얘기지만 View Frustum 밖에 있다면 렌더링 될 가능성이 없겠죠. (그림에 A, B 그룹은 모두 보인다고 판단할 수 있겠네요.)
Vis 그룹은 AABB 로 만들었기 때문에 처리상 연산을 줄이는 이득이 있었습니다.
화이트 데이 에서는 카메라와 Vis 그룹과의 거리를 검사해서 적당히 멀리 있을 경우에는 렌더링 하지 않도록 했습니다. 기본적인 frustum 컬링을 통해서 판단할 수 있지만 워낙 오브젝트가 많아서 화이트 데이에서는 가시 거리에 있어도 멀리 있는 경우에는 렌더링 하지 않게 설정했습니다. (개발 중에 세팅을 잘못해서 비교적 멀지 않은 거리에서 오브젝트가 사라졌다 나타났다 한 적이 있는 데, 그 자체가 무서웠다는 반응도 있었던 기억이 나네요.^^)
그리고 문이 닫겨서 Vis 그룹이 완전히 외부로 부터 차단된다고 판단되는 것들은 따로 관리를 했습니다. 문마다 노가다로 Vis 그룹을 설정해서 문이 닫기거나 열리면 Vis 그룹에 프래그를 바꾸도록 스크립트로 작성해두었습니다. 만약 그림의 B 와 같은 경우도 문이 닫겨 있다면 보일 가능성이 없다고 판단할 수 있겠죠.
화이트 데이의 경우 교실마다 창문이 있기 때문에 문으로 완전히 안보이는 설정은 맞지가 않아서 아예 교실안을 문이 닫겼을 때 보이는 영역과 그렇지 않은 두 영역으로 분할해서 별도로 처리했습니다. 그래서 바닥쪽의 Vis 그룹은 이 설정이 적용되도록 만들었습니다. (책상, 의자 등이 해당되는 데, 수가 많은 편이라 꽤 큰 이득이 있었습니다.)
그리고 카메라의 중심점이 vis 그룹 안에 있으면 조건에 상관없이 보일 가능성이 있다고 판단할 수 있습니다.
이 경우는 다른 조건들은 모두 무시합니다. (교실안에선 문이 닫겨 있다고 해서 안 그려도 된다는 판단을 할 수는 없겠죠.)
1. 카메라의 중심점이 그룹안에 있는가 ? (yes -> 보일 가능성 있음)
2. 문이 닫겨서 보일 가능성이 없는가 ?
3. 멀리 있어서 보일 가능성이 없는가 ?
4. View Frustum 영역을 벗어나 보일 가능성이 없는가 ?
화이트 데이는 속도를 고려해서 위의 순서로 가시성 체크를 했습니다.
마지막으로 제목에서 암시한 포탈을 응용한 두번째 사기성 컬링 체크를 추가해주면 됩니다.(역시 사기에 가깝지만, 나름대로는 게임 레벨의 특수성을 활용다고 변명을... ^^)
그림을 봤을 때 A 그룹은 벽이 가로 막혀 있기 때문에 렌더링 되지 않는 것이 맞겠죠 ? 마지막 방법은 이걸 판단하는 것입니다.
기본적으로 그림과 같은 2d 라고 할 경우 임의의 위치에서 vis 그룹이 보이는 것은 왼쪽, 오른쪽, 위, 아래면을 통해서 일겁니다. (여기에 면은 무한 평면이 아니라 정점 4개를 가지는 사각면입니다.)
여기에 Vis 그룹별로 벽에 해당되는 면을 프래그가 있다면 그 면을 통해서 볼 수 있는 지 체크할 수 있습니다.
그림의 경우 A 그룹은 위, 아래, 왼쪽은 벽이기 때문에 오른쪽 면만 보일 수 있다고 판단되겠죠. 이 오른쪽 면을 일종의 포탈이라고 판단하면 포탈이 화면에 렌더링 될 가능성이 있는 지로 가시성 테스트를 할 수 있습니다. 그래서 그룹 A는 빨간선에 해당하는 오른쪽 면이 시야에 없으므로 그룹 A는 렌더링 될 가능성이 없다고 판단될 것입니다.
3차원으로 확장할 때 면이 6개가 된다는 것 외에는 차이점이 없다고 할 수 있습니다.
만약 그림에서 벽이 다 유리라고 가정한다고 해도 A의 왼쪽면을 통해서 그룹 A가 보일 가능성은 없을 것입니다. 벽의 노말과 카메라의 시야와 관계를 생각해보면 적용할만한 좋은 아이템이 생각나실 겁니다. backface culling 이죠.
A. 벽면이 아니라 포탈에 해당하는 면인가 ?
B. view 에서 봤을 때 해당 면이 카메라를 향하는가 ? (backface culling 응용)
C. 해당 면이 화면 안에 있는가 ?
그래서 각 6개의 면을 위처럼 체크하는 것으로 그 VIS 그룹이 보일 것인지 아닌지를 판단할 수 있습니다.
체크하는 방법은 어느 정도 레벨의 특성에 기인한 방법이긴 하지만 Vis 그룹이 포탈을 통해 보이는 가를 판단하는 일반적인 개념과는 동일한 모양입니다.
이상이 두가지 컬링에 대한 것입니다. 이번에 적은 vis 그룹과 관련된 것들은 상당히 효과가 있었습니다. (vis 그룹이란 말은 그냥 제맘대로 붙인 것이니 용어 자체에는 의미 두시 마시길... T_T)
댓글을 달아 주세요
그런 경이롭 위치를 위해 많게의 감사!
위치에 중대한 일은 그것을 좋아했다!
관심을 끌. 너가 동일할 좋을 지점을 다시 배치할 것 을 나는 희망한다.
친구는 너의 위치의 현재 팬이 되었다!