Camera Frustum과 Culling

NDC 정점 8개를 Inverse Projection, Inverse View 변환을 수행하여 Camera Frustum 생성

평면

정점 3개를 통한 외적, 또는 1개의 Normal Vector와 1개의 정점

AABB, OBB

AABB

Near-Left-Bottom, Far-Right-Top 정점 2개를 통해 표현 가능

OBB

Center, Direction(x, y, z), width, height, depth 7개 정보로 표현 가능

충돌


D1=VND_1 = \vert{\vec{V} \cdot \vec{N}}\vert
D1=(VN)N\vec{D_1} = (\vec{V} \cdot \vec{N})\vec{N}
만약 OBB가 직사각형이라면
V=w2x+h2y+d2z\vec{V} = \frac{w}{2}\vec{x} + \frac{h}{2}\vec{y} + \frac{d}{2}\vec{z}

참고 : AABB와 Camera Frustum의 충돌은 OBB와 Camera Frustum 충돌과 다를바 없음

OBB 생성

모든 Vertex에 대한 Center(평균) 구하기
공분산(?)을 이용하여 기저 벡터 구하기

참고

위 작업은 상당히 많은 연산을 요구하므로 Application 시작전에 계산을 미리 해놓던가, Model 제작과 함께 생성해야 함

참고

1개의 Object는 다수의 OBB의 트리 구조로 이루어져서 연산량을 최소화 해야 함

Camera와 출력

지금까지의 모든 출력은 바로 BackBuffer에 작성하는 방식으로 작업했지만, Texture에 작성하여 BackBuffer에 Texture mapping하는 방식을 적용한다면 Texture 후처리를 통해 다양한 효과를 얻을 수 있음

Camera와 Map

Map을 이루는 다수의 face 중 출력할 face만 구분하기위해서는 공간분할을 수행하는 것이 좋음
그 외에 Index, Vertex단위로 Frustum과의 충돌 검사를 통해 출력할 Resource 판정도 가능

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN