본문 바로가기
DirectX 12/Camera & Lighting

[DirectX12 - Camera & Lighting] Chapter 06. Frustum Culling

by song.ift 2023. 6. 23.

GitHub : https://github.com/developeSHG/DirectX12-Camera_Lighting/commits/06.Frustum_Culling

 

GitHub - developeSHG/DirectX12-Camera_Lighting: DirectX12 - Camera & Lighting

DirectX12 - Camera & Lighting. Contribute to developeSHG/DirectX12-Camera_Lighting development by creating an account on GitHub.

github.com

 

결과물

 

 


 

 

 

렌더링하기까지 했던것을 살펴보면
Input Assemembly 에서 콘텍스트 버퍼와 버텍스 정보를 세팅하고,
버텍스 쉐이더에서 각 버텍스를 변환한다.(행렬, uv 등등)
그다음 레스터라이즈에서 사이 보간된 것을 만들고
픽셀 쉐이더에서 각 픽셀에 대한 연사을 진행.
그다음 뒤에 더 있지만 생략

아무튼 이러한 작업을 cpu가 아닌 gpu에서 하는데, 여태 절두체 밖에 있는 것들도 다 진행했다.
당연히 그려줄 필요도 없는데 같이 하고 있으니 그만큼 비용이 발생.
그래서 그려주지 않아도 되는 것들을 절두체 컬링을 해버리고, 이 작업을 gpu가 아닌
cpu에서 넘기기 전, 미리 거르는 작업을 함으로써 맨 위의 행동을 아에 안하도록 최적화를 하는 것이 절두체컬링


 

ax + by + cz + d = 0;
이것이 거르는 식

예를 들면 평면안에 무수히 많은 점이 있다.
어떤 특징이 있냐면 각각 x,y,z가 있는데 위에 식을 대입했을 때, 만족한다면 그 점은 평면위에 있다 라는 결과가 된다.

ax + by + cz + d = 0;
에서 ax + by + cz는 해당 점의 좌표와 평면의 노말벡터가 내적한 값이다. 
만약 해당 점의 좌표가 평면 선에 딱 위치한 점이라면 ax + by + cz = 0이 되어서
(ax + by + cz) + d = -d + d = 0이 된다. 

그래서 결과를 보면
ax + by + cz + d = 0;  => 딱 평면 선에 위치한 점
ax + by + cz + d < 0;  => 음수라면, 평면보다 앞에 있다. (덜 간것)
ax + by + cz + d > 0;  => 양수라면, 평면보다 넘어가서 있다. (더 간것)
이 특징과 공식을 이용해서 절두체 컬링이 진행된다고 볼 수 있다.

 

절두체는 6개의 평면이 있는데 위의 특징과 공식을 이용해 각각 평면의 노말벡터로 점과 내적해서
양수인지 음수인지 판단해서 양수면 절두체 밖에 있다라고 봐서 컬링을 판단하면 된다.
그래서 총 연산은 6번

하지만 물체가 점으로 될순없고, 당연히 부피를 가지고 있다.
그래서 부피는 구를 사용한다.
r을 반지름이라고 보고,
ax + by + cz + d > r을 판단한다.

 



근데 컬링을 하려면 평면을 만들어야 한다.
그럼 우리는 절두체를 어떻게 알아야할것이느냐? 인데

모든 물체는 월드 좌표 기준으로 관리를 한다.
절두체라는 건 까메라가 찍는 범위다.
절두체의 평면을 가장 쉽게 구할수있는 방법은 투영 레벨로 시작해서 거꾸로 역으로 올라가는 법이다.
우리가 보는 화면이란건 Local -> World -> View -> Projection 순으로 과정이 진행된다.
우리가 본 절두체도 투영으로 넘어가면 예전에 배운 -1 ~ 1 사이 값. z는 0 ~ 1로 떨어진다는 걸 알고있다.
그래서 투영에서의 좌표를 안다는 것은 거슬러 올라가
절두체의 크기를 알아내기 위해 월드로 가려고 투영에서 역으로 가는것이다.
절두체와 모든 물체를 비교하려면 world에서 해야하기 때문에
Projection에서 역행렬을 이용해 뷰 -> 월드로 돌아가서 계산을 진행할것이다.

댓글