본문 바로가기
C++ 200제/코딩 IT 정보

[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명

by vicddory 2017. 10. 24.

[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명


Rasterize

엄격한 의미로 Rasterize는 OpenGL ES가 3차원 물체를 2차원 이미지로 만드는 수학적 동작을 말한다. 3차원으로 구성되어 있어도 모니터에 보이는 이미지는 어쨌거나 2D다.


눈에 보여야 할 이미지들의 순차적인 영역 조각들은 Fragment shader에 의해 처리된다. OpenGL ES에서 3차원 물체 아래 3가지로 분리된다.


1. 지금 눈에 보이는 것

2. 지금 이후에 보이는 것

3. 지금 이전에 보였던 것


하지만, Programmable pipeline 그림[OpenGL ES 강의 1 참조[링크]]에서 Rasterize는 그래픽 파이프라인의 작은 부분이란 것을 확인할 수 있다.


근데 이게 왜 중요하냐?


Rasterize는 3차원 물체에서 2차원 이미지를 만드는 과정이란 것이다. 3차원 화면이 보일 때마다 Rasterize가 구동되며 frame buffer를 업데이트하기 때문이다.


Face Culling

이제 Culling의 앞면과 뒷면(Front facing, Back facing)에 관해서 이야기해보자. OpenGL ES는 안 보이는 면을 찾아서 무시(비활성화)한다. 머리속으로, 면이 있는 3차원 애플리케이션을 상상해보자.


개발자는 한쪽 면만 보이길 원하지만(벽, 바닥 등) 기본적으로 OpenGL ES는 양쪽 면을 모두 그린다. 이걸 해결하기 위해서 culling을 이용한다.


[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명[[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명]


Opengl ES는 꼭지점의 정렬 순서를 바탕으로 앞면과 뒷면을 구분할 수 있다. (정확히 각 삼각형이 앞면인지 뒷면인지 계산한다) 개발자는 culling을 이용하여 OpenGL ES에게 특정 면을 무시하라 지시할 수 있다.


그림을 보자.


OpenGL ES, culling_example[[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명]


Culling은 3가지 방법으로 유연하게 사용할 수 있다. 위의 그림은 그중 한 가지를 보여주는 것으로 당신은 그림을 보고 어떻게 동작하는지를 이해해야 한다.


위의 그림 속 삼각형은 꼭지점 1, 2, 3으로 구성되어있다. 왼쪽 삼각형은 순서가 1, 2, 3이고, 오른쪽은 1, 3, 2다. Culling은 기본적으로 반시계방향으로 좌표를 인식해 삼각형의 앞면을 인식한다. (1, 2, 3의 순서로 읽으면 앞면)


그렇기에 오른쪽 삼각형은 뒷면으로 인식될 테고, 화면에 그려지지 않는다. rasterization 처리에서 무시된다.

이런 특징을 사용하려면 OpenGL ES, glEnable 함수에 GL_CULL_FACE를 넣으면 된다. 그러면 위의 그림처럼 동작하게 된다.


OpenGL ES Rasterize, Face Culling[[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명]


이런 기본적인 동작 방식을 변경하려면 아래의 함수를 사용하자.


Cull Face properties

GLvoid glCullFace(GLenum mode)


mode : 그리지 않은 면을 지정

GL_BACK: This will ignore the back faces. This is the default behavior.

GL_FRONT: This will ignore the front faces.

GL_FRONT_AND_BACK: 앞면 뒷면 모두 무시(이 멍청한 값이 왜 존재하는지 이해를 못 함)


GLvoid glFrontFace(GLenum mode)


mode : 어떤 방식으로 앞면을 정할지 지정

GL_CCW: This will instruct OpenGL ES to treat triangles formed in counter clock wise as a Front Face. This is the default behavior.

GL_CW: This will instruct OpenGL ES to treat triangles formed in clock wise as a Front Face.


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 6. Rasterize, Face Culling 3차원 설명

댓글