08. 가시성 판단

하이솝·2026년 5월 15일

컴퓨터그래픽스

목록 보기
8/9

학습목표

  • 후면제거의 정의와 처리방법을 이해한다.
  • 절단작업의 정의와 처리방법을 이해한다.
  • 지엘의 절단 방법을 이해한다.
  • 은면제거의 정의를 이해한다.
  • 지-버퍼 알고리즘을 구체적으로 이해한다.

01. 벡터

1-1. 정규화 벡터(Normalized Vector)

|p| = root(x^2 + y^2 + z)
p' = (x/|p|, y/|p|, z/|p|)

1-2. 벡터의 내적과 외적

내적(Inner/Dot Product)

s·t = |s| |t| cos(θ) = SxTx + SyTy + SzTz
  • 두 벡터가 수직이면, 내적은 0
  • 예각이면 +, 둔각이면 -

외적(Outer/Cross Product)

  • 벡터의 크기가 평행사변형의 넓이와 동일함
  • 정규화 법선벡터 = 정규화 외적벡터
    두 벡터를 구한 후 외적

1-3. 평면 표현

1-4. 지엘의 법선 벡터

법선 벡터 방향

  • 삼각형이 PQR로 정의되었을 때, 오른손으로 명시된 정점 순서대로 감쌌을 때
    엄지 손가락의 방향이 벡터의 방향이 됨

  • PQ벡터인 s, PR벡터인 t 순서로 곱해 s x t
    t x s가 되면 벡터 방향이 반대가 됨
    정점 나열 순서를 기준으로 PQR이므로
    PQ 벡터 다음은 같은 곳에서 출발하는 PR이 되는 것임

02. 후면 제거

2-1. 후면 제거 (Backface Culling/Removal)

  • 후면은 전면에 가려져서 보이지 않음
  • 후면을 그리지 않고 생략해도 최종 영상은 불변
  • 시점과 면의 관계로 빠르게 판단 가능
  • 보이지 않는 면의 거의 절반을 제거
  • 단, 구멍 없이 연결되었을 때(닫혀있을 때)만 성립

  • 관찰하는 방향과 벡터의 방향이 반대(둔각, 내적했을 때 0보다 작음)를 의미
    Backface = (N·V < 0) = (|N||V|cosθ < 0)

지엘의 후면 제거


법선벡터의 z값만으로 판단 가능

  • 법선벡터의 z성분이 양수이면 제거, 음수이면 그리기

OpenGL

  • glEnable(GL_CULL_FACE);
  • glCullFace(GL_FRONT);

2-2. 표면과 이면

하나의 면 = 표면 + 이면

표면

  • 반시계방향으로 정의된 면을 표면으로
    glFrontFace(GL_CCW)
    CCW: Counter Clock Wise

  • 시계방향으로 정의된 면을 표면으로
    glFrontFace(GL_CW)

닫혀있지 않은 경우
열려있는 뒷면을 다른 색을 선택하여 그릴 수 있음

glEnable(GL_CULL_FACE);	//
// 열려있는 물체에 대해서 Backface Culling을 적용하게 되면 
// 뒤에 있는 물체라고 판단 시 그리지 않으므로 오류가 발생할 수 있음
glFrontFace(GL_CW);			// 2. 주전자 데이터는 CW로 만들어짐. 표준은 CCW
glCullFace(GL_BACK);		// 3. GL_FRONT로 변경
// GL_CCW, GL_FRONT에 대해서도 같은 결과가 나옴
// CCW → BACK(정상), CW → FRONT(정상)
// glPolygonMode(GL_FRONT, GL_FILL);	// 4. 모드 설정
// glPolygonMode(GL_BACK, GL_LINE);		// 4. 모드 설정
glEnable(GL_DEPTH_TEST);	
// 눈에 가장 가까운 부분을 출력해서 그려줌
// 이 기능을 끄게 되면 규칙 없이 그려지는 순서대로 덮어져서 보임

03. 절단 알고리즘

3-1. 코헨-서더런드 알고리즘

  • 0000: 윈도우 창 영역

  • 바깥 판정에 대해 4비트 아웃코드(Outcode)를 둠
    비트의 각 자릿수는 TBLR(Top, Bottom, Left, Right)

테스트 1) E1 = E2 = 0000

  • 완전히 사각형 내부 선분이므로 보이는 선분으로 판정한다. (선분 A)

테스트 2) E1 & E2 != 0000

  • 선분이 온전히 절단 사각형 밖에 있으므로 제거한다. (선분 B)

테스트 3) E1 != 0000, E2 = 0000 (또는 그 반대)

  • 교차점 계산에 의해 절단한다. (선분 C)

테스트 4) E1 & E2 = 0000

  • 양끝점이 모두 절단 사각형 밖에 있지만 서로 다른 선분이다.
  • 교차점 계산에 의해 절단한다. (선분 D, D')

선분 분할

  • 분할된 선분을 대상으로 다시 테스트

예) D = E1(0010), E2(1000)

  • 왼쪽선 (또는 위쪽선) 기준으로 E1, E2의 경계점인 E3(1000)의 좌표를 계산한다.
  • 기준선이 왼쪽선이므로, 기준선 밖에 있는 E1을 E3로 옮긴다.
  • 이제 E3,E2 선분에 대해 다시 검사한다. Test 4에 의해 제거된다.
  • Test4: E3 & E2 == 1000 != 0000 이므로 제거

3-5. 내/외부 판정 및 교차점


  • 각도에 따라서도 판별이 가능함
    수직: 평면 위
    예각: 평면 바깥쪽
    둔각: 평면 안쪽

05. 은면 제거

  • 보이지 않는 면을 제거 하기 위한 작업으로
    물체 정점의 깊이(Depth), 즉 z 좌표를 필요로 함

5-1. 페인터 알고리즘

  • 멀리 있는 물체부터 그리며 계속해서 덧그림
    깊이 정렬(Depth Sort)이 필요
    Zmax를 기준으로 물체를 정렬

  • 정렬 비용이 매우 높음

  • 교차하는 물체의 경우 중점을 잡고 분류함

5-2. 지-버퍼 알고리즘

지-버퍼(z-Buffer) 또는 깊이버퍼(Depth-Buffer)

  • 각각의 픽셀마다 가장 가까운 z값(깊이)을 저장하는 버퍼


  • 모든 픽셀을 흰색(White)로 초기화
    지-버퍼에는 가장 먼 값인 1.0으로 초기화

  • 색이 채워진 부분을 Color buffer에는 갈색(Brown)으로 초기화
    해당 물체는 거리가 0.5로, 기존 1.0보다 가까우므로 지-버퍼 수정 가능

  • 기존의 거리보다 더 가까운 물체의 거리와 색상값을 수정

0개의 댓글