개발/Graphics

컴퓨터 그래픽스 이론 정리 - 후면제거, 표면과 이면

huiyu 2018. 6. 9. 08:23

후면제거

1. 후면제거

- 위 그림에서 화살표 방향은 원구 표면에서 다각형의 법선 벡터를 의미한다.
- 시점은 왼쪽에 위치, 원구를 반으로 잘랐을 경우 오른쪽 B에 있는 면들은 실제로 보이지 않게 된다.

위와 같이 보이지 않는 면을 후면(Back-Facing Polygon), 법선 벡터가 시점을 향한 면을 전면(Front-Facing Polygon)이라 한다.

*후면제거(Backface Culling, Backface Removal) : 후면을 판단하고 제거하는 과정, 후면은 단지 시점의 위치와 해당 면이 서있는 방향만으로 판단.

 - V1 : 면 A의 시점 벡터
 - N1 : 면 A의 법선 벡터
 - V2 : 면 B의 시점벡터
 - N2 : 면 B의 법선 벡터

--> 후면 여부는 법선 벡터와 시점 벡터의 내적에 의해 간단히 판정할 수 있다.
  주어진 면에서 두 벡터의 내적이 양이 값이면 전면이고, 음의 값이면 후면이다.

우변에서 N과 V 벡터의 절댓값은 항상 양이므로 결국, 내적의 부호는 코사인 값에 의해 결정된다.

두 벡터가 이루는 각이 예각(<=90)이면 코사인 값이 양이되고, 반대로 둔각(>=90)이면 음이다.
위 그림에서 B의 두 벡터가 이루는 각이 둔각이므로, 후면으로 판단할 수 있다.(벡터의 내적)


지엘의 후면 제거

- 보이지 않는 면 중에서 가장 처리가 간단한 것이 후면이다.
후면 여부는 다른 물체면과는 관계없이 시점 위치와 해당 면만으로 판별이 가능하기 때문이다.
따라서 후면 판정은 빠를 수록 좋다. 후면으로 판정된 면을 그래픽 파이프라인에서 미리 제외시킴으로써 전체적인 그래픽 처리시간이 단축되기 때문이다.

1
2
3
void glEnable(GL_CULL_FACE);
void glCullFace(GLenum mode);
void glDisable(GL_CULL_FACE);
cs

- glEnable() : 후면 제거 모드 활성화
- glCullFace() : 실제 후면제거 작업 수행(GL_FRONT, GL_BACK, GL_FRONT_AND_BACK)
- glDisable() : 후면 제거 모드 비활성화


2. 표면과 이면

 - 표면(Outer Face, Front Face) : 물체의 바깥쪽 면
 - 이면(Inner Face, Back Face) : 물체의 안쪽 면
 -> 경우에 따라서 표면만 또는 이면만 보일 필요가 존재하고, 또 서로의 색이 다를 수 있어 별도로 취급

- 시점에서 보았을 때 반시계 방향으로 표시한 면이 표면이다. (a)-표면, (b)이면

- 그림의 좌측 시점에서 육면체를 바라보는 경우 시선이 4개의 면과 교차한다.
- A1, A2는 각각 육면체 왼쪽면의 표면과 이면이고, B1, B2는 각각 육면체 오른쪽 면의 이면과 표면이다.

-경우에 따라서는 시계방향으로 표시한 면을 표면으로 처리할 필요가 있다.
 그럴 경우 아래 함수 사용

1
void glFrontFace(GLenum mode);//GL_CW, GL_CCW
cs

- GL_CCW : 반시계방향 면을 표면으로 처리
- GL_CW :  시계방향 면을 표면으로 처리


728x90
반응형