Typing diary
Backface Culling 본문
후면 추리기(Backface Culling)
컴퓨터 그래픽스에서 카메라의 반대 방향을 보고 있는 폴리곤을 판별해 렌더링에서 제외하는 것이다.
불필요한 연산을 줄여 최적화에 도움이 되고 반투명 물체를 구현하는데 필요하다.
CW(Clock wise), CCW(count clock wise)
폴리곤 정점의 배열이 시계방향인지, 반시계방향인지를 판단하여 면이 앞을 보고 있는지, 뒤를 보고 있는지 판단한다.

카메라 위치를 c, 폴리곤 정점의 위치를 각각 p0,p1,p2라고 하자

정점 하나를 기준으로 잡고 나머지 정점을 향하는 벡터 v0,v1을 다음과 같이 구할 수 있다.

두 벡터를 외적하면 폴리곤의 법선벡터인 n을 구할 수 있다.

카메라에서 폴리곤의 기준점을 향하는 벡터 r을 다음과 같이 구할 수 있다.

r과 n의 내적값이 0보다 작으면 폴리곤이 카메라의 반대 방향을 본다는 의미이므로 렌더링을 하지 않으면 되고
반대로 0보다 클 경우엔 렌더링 하면 된다.
오른손 법칙을 생각했을때 정점 배열이 반시계 방향으로 배치되 있어야 폴리곤이 앞면인 것을 알 수 있다.
코드구현
void Renderer3D::BackfaceCulling(const Polygon& poly)
{
Vec3 v0, v1, n;
v0 = poly.vertex[1] - poly.vertex[0];
v1 = poly.vertex[2] - poly.vertex[0];
n = Vec3::CrossProduct(v0, v1);
Vec3 cameraRay = poly.vertex[0] - m_pCamera->pos;
if (Vec3::DotProduct(n, cameraRay) >= 0.0f)
{
Render(poly);
}
}
'그래픽스, 게임 수학' 카테고리의 다른 글
Raytracing (0) | 2022.08.21 |
---|---|
행렬식(determinant) (0) | 2022.08.21 |
LU 분해 (0) | 2022.08.21 |
확장 행렬과 가우스-조던 소거법 (0) | 2022.08.21 |
벡터 방정식 (0) | 2022.08.21 |