Hello COCOBALL!

[LearnOpenGL] 25. Face culling 본문

OpenGL

[LearnOpenGL] 25. Face culling

coco_ball 2022. 8. 22. 23:25

3D cube를 그릴 때, 어느 방향에서 봐도 최대 3개의 면을 볼 수 있기 때문에 나머지 3개의 면은 그릴 필요가 없음 → 볼 수 없는 면을 그리지 않음으로 인해 fragment shader의 동작을 50% 이상 줄일 수 있다

 

그렇다면 특정한 면이 viewer에게 보이지 않는다는 것을 어떻게 알것인가?

모든 닫힌 면은 양면을 가지고 있고, 한쪽은 viewer에게 향해 있고 다른 한쪽은 viewer를 등진다.

→ viewer에게 향하고 있는 면만 렌더링 ( 이것이 face culling이 하는 작업 )

 

front facing은 렌더링 하고, back facing은 렌더링 하지 않는다.

 

이제 우리는 OpenGL에게 front인지 back인지 알려주는 특정한 방식이 필요하다.

 

Winding order

OpenGL은 렌더링 할 때 clockwise, counter-clockwise 정보를 활용하여 front-facing인지 back-facing인지 결정 ( default : 반시계 방향이 front-facing)

 

Face culling

glEnable(GL_CULL_FACE);

 

다음 함수를 호출한 이후로부터, front-facing이 아닌 경우 모두 폐기된다.

glCullFace(GL_FRONT);

 

여러 옵션으로 폐기하고 싶은 면의 유형을 바꿀 수 있다. (default : GL_BACK)

  • GL_BACK: Culls only the back faces.
  • GL_FRONT: Culls only the front faces.
  • GL_FRONT_AND_BACK: Culls both the front and back faces.

 

glFrontFace(GL_CCW);

OpenGL에게 시계 방향의 면이 후면이 아닌 전면이라고 알릴 수 있다.

기본값은 GL_CCW이고, GL_CW는 시계 방향을 의미한다.

 

example

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);

두 개의 example 코드의 결과는 후면만 렌더링 된다.

face culling은 적은 비용으로 OpenGL의 성능을 증가시킬 수 있다는 이점이 있다.

'OpenGL' 카테고리의 다른 글

[LearnOpenGL] 27. Cubemaps  (0) 2022.08.22
[LearnOpenGL] 26. Framebuffers  (0) 2022.08.22
[LearnOpenGL] 24. Blending  (0) 2022.08.22
[LearnOpenGL] 23. Stencil testing  (1) 2022.08.22
[LearnOpenGL] 22. Depth testing  (1) 2022.08.22