DirectX Graphics 프로그래밍 가이드 튜토리얼, 샘플, 툴, 힌트 샘플 Cull 샘플   [목차열람] [주소복사] [슬롯비우기]
Cull 샘플
 
Microsoft DirectX 9.0

Cull 샘플


설명

이 샘플에서는, 개체 경계 박스 (OBB)가 절두체안에 없는 개체를 컬링(Culling) 하는 방법을 나타낸다. 이러한 개체를 Microsoft® Direct3D® 에 건네주지 않는 것에 따라, 표시되지 않는 이러한 개체의 변환 및 조명에 Direct3D 가 소비하는 시간을 절약할 수 있다. 이러한 개체가 많이 있는 경우나, 이러한 개체가 많은 정점을 포함한 경우는, 이 시간의 절약은 매우 큰 것이 될 수 있다.

좀 더 복잡한 컬링(Culling)를 효율적으로 실시하려면 , 개체의 계층을 생성 해, 개체의 그룹을 둘러싸는 경계 박스를 사용한다. 그렇게 하는 것으로, 모든 개체의 OBB 를 절두체와 비교할 필요가 없어진다.

Direct3D 로 OBB 를 변환 해 그 결과의 클립 플래그를 체크하는 것보다도, 독자적인 코드로 이 OBB 와 절두체의 교차의 계산을 실시하는 쪽이 효율적이다.

이 샘플내의 컬링(Culling) 루틴은, 생성 하는 프로그램의 요구에 맞추어 수정 할 수 있다.

패스

소스 파일 : (SDK 루트) \Samples\C++\Direct3D\Cull

실행 가능 파일 : (SDK 루트) \Samples\C++\Direct3D\Bin

사용자 가이드

이 프로그램을 실행 하면, 찻주전자가 2 개의 뷰포트에 렌더링 된 장면(scene)가 표시된다. 우측의 뷰포트에서는, 절두체를 사용해 컬링(Culling)를 한다. 좌측의 뷰포트에는 독립한 카메라가 있어, 어디서 컬링(Culling)를 할지를 알도록(듯이), 우측의 뷰포트의 절두체가 가시 개체로서 표시된다. 이 장면(scene)에는 50 개의 찻주전자가 랜덤에 배치되고 있어, 반투명의 OBB 에 따라 렌더링 된다.

찻주전자는, 컬링(Culling) 스테이터스를 알 수 있도록(듯이), 다음과 같이 물이 들 수 있는 되고 있다.

컬러설명컬링(Culling) 스테이터스
진한 초록개체가 절두체의 안쪽에 있는 것이 곧바로 확인되었다. CS_INSIDE
밝은 초록개체가 절두체의 안쪽에 있는 것이, 얼마인가의 작업을 거쳐 확인되었다. CS_INSIDE_SLOW
진한 빨강개체가 절두체의 외측에 있는 것이 곧바로 확인되었다. CS_OUTSIDE
밝은 빨강개체가 절두체의 외측에 있는 것이, 얼마인가의 작업을 거쳐 확인되었다. CS_OUTSIDE_SLOW

우측의 윈도우에 표시되는 것은, 녹색의 찻주전자 뿐이다. 대부분의 찻주전자는 진한 초록인가 진한 빨강이다. 이것은, 시간이 걸리는 테스트가 필요한 것은 적었던 것을 나타내고 있다.

우측의 뷰포트의 카메라를 이동하려면 , 윈도우의 우측을 클릭해, 아래에 표시되고 있는 카메라 키를 사용해 이동한다.

좌측의 뷰포트의 카메라를 이동하려면 , 윈도우의 좌측을 클릭해, 아래에 표시되고 있는 카메라 키를 사용해 이동한다.

찻주전자를 회전시켜, 절두체에 대한 특정의 관계를 셋업 할 수도 있다. 테이폿트는 이동할 수 없지만, 절두체를 이동하는 것에 의해 같은 이펙트를 얻을 수 있다.

다음의 표는, 처리 되고 있는 키를 나타내고 있다. 메뉴 커멘드를 사용해 같은 조작을 실시할 수가 있다.

동작
F1헬프 또는 사용 가능한 커멘드를 표시하는
F2새로운 렌더링 장치 또는 디스플레이 모드를 선택하도록(듯이) 사용자에 지시하는
Alt+Enter풀 스크린 모드와 윈도우 모드를 바꾸는
Esc애플리케이션을 종료하는
W, S, 방향 키카메라를 이동하는
Q, E, A, Z카메라를 회전하는
Y, U, H, J찻주전자를 회전하는
N좌측의 카메라를 우측의 카메라와 같은 위치로 이동하는
M우측의 카메라를 원래의 위치로 이동하는

프로그래밍 정보

이 프로그램에서는, 다음과 같은 OBB 와 절두체와의 교차 알고리즘을 사용하고 있다.

  1. OBB 의 모퉁이의 포인트가 1 개에서도 절두체의 안쪽에 있으면, CS_INSIDE 를 돌려준다.
  2. 그 외의 경우, OBB 의 모든 모퉁이의 포인트가 절두체의 1 개의 면의 외측에 있으면, CS_OUTSIDE 를 돌려준다.
  3. 그 외의 경우, 절두체의 엣지가 1 개에서도 OBB 의 면을 관통하고 있으면, CS_INSIDE_SLOW 를 돌려준다.
  4. 그 외의 경우, OBB 의 엣지가 1 개에서도 절두체의 면을 관통하고 있으면, CS_INSIDE_SLOW 를 돌려준다.
  5. 그 외의 경우, 절두체내의 포인트가 1 개에서도 OBB 의 모든 면의 외측에 있으면, CS_OUTSIDE_SLOW 를 돌려준다.
  6. 그 외의 경우, CS_INSIDE_SLOW 를 돌려준다.

CS_INSIDE 와 CS_INSIDE_SLOW 의 달라, 및 CS_OUTSIDE 과 CS_OUTSIDE_SLOW 의 차이는, 여기에서는 학습의 목적에서만 가리키고 있다. 출하용 애플리케이션에서는, 보통은, OBB 가 절두체의 안쪽에 있는지 외측에 있는지 만 알면 좋기 때문에, CS_INSIDE 및 CS_OUTSIDE 에만 컬링(Culling) 스테이트를 짜넣는 것이 일반적이다.

여기서 가리키는 컬링(Culling) 코드는, 읽기 쉽게, 불필요한 처리를 포함하지 않는 단순한 코드가 되어 있다. 퍼포먼스의 최적화는 행해지지 않았다. 특히, 경계 박스가 보통의 박스 (예를 들어, 전면과 뒷면이 평행이 되어 있다)의 경우는, 추가의 최적화 처리를 실시할 수가 있다. 이 알고리즘을 일반화하면, 볼록한 모양의 임의의 형태의 경계를 사용해, 안의 모델에 의해 딱 맞은 경계에 근거하는 처리를 할 수 있을 것이다.

이 샘플에서는, 헬퍼-함수등의 프로그래밍 요소로부터 구성되는 Microsoft DirectX® 코드를 사용한다. 이 코드는 DirectX 소프트웨어 개발 킷 (SDK) 외 샘플과 공유되고 있다. 샘플 프레임워크(framework)의 헤더는 (SDK 루트)\Samples\C++\Common\Include, 소스 코드는 (SDK 루트) \Samples\C++\Common\Src 에 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP