Skip to content

OpenGL ES

OpenGL ES (임베디드 단말을 위한 OpenGL)는 크로노스 그룹이 정의한 3차원 컴퓨터 그래픽스 API인 OpenGL의 서브셋으로, 휴대전화, PDA 등과 같은 임베디드 단말을 위한 API이다.

OpenGL ES 1.1 & 2.0

OpenGL ES에는 크게 두 가지 버전이 있다.

OpenGL ES 1.1은 OpenGL 1.5와 호환되는 버전으로, fixed function hardware를 위한 API를 제공한다. 1.1 버전에서는 기존 OpenGL에서 자주 쓰이던 glBegin/glEnd, color index mode, GL_QUAD/GL_POLYGON과 같이 코드 크기 및 성능에 나쁜 영향을 미치는 primitive들이 쓰이지 않는 대신, Vertex Array, Vertex Buffer Object (VBO)등의 API를 사용하고 있으며, full transform, lighting, multitexturing, fixed point, floating point 등의 기능을 충실히 제공하고 있다.

OpenGL ES 2.0은 OpenGL 2.0과 호환되는 버전으로, shader를 사용한 programmable hardware를 위한 API를 제공한다. Fixed function pipeline을 제거하고 vertex shader와 fragment shader를 사용하고 있으며, 이를 위해 GLSL ES라고 하는 shading language를 지원한다.

OpenGL ES 1.1과 2.0은 서로 호환되지 않기 때문에 1.1로 작성된 코드를 2.0에서 돌리기 위해서는 코드를 새로 작성해야 하며, 2.0 코드를 1.1에서 돌릴 때도 마찬가지이다.

gluPerspective() 구현

원근투영을 나타낼때 OpenGL에 있는 gluPerspective함수가 없고, glFrustumf함수만 있다. 따라서 아래와 같이 구현할 수 있다.

//------------------------------------------------------------------------------
// gluPerspective 함수 구현
//
// opengles 에는 gluPerspective 함수가 없고, glFrustumf 함수만 있다.
// gluPerspective 함수가 더 직관적이고, 사용하기 편하므로,
// 
// iFovy : 시야의 각도. (0.0 ~ 180.0)
//         이 값이 크면 넓게 보는것임 (오브젝트들이 작게 보임)
//         이 값이 작으면 좁게 보는것임 (오브젝트들이 크게 보임.
//                                                   각도 밖의 오브젝트는 시야에서 벗어나서 안보임)
// iAspect : 시야의 종횡비 (w / h)
// iNear : 시점에서 관측공간 (=절두체) 앞부분의 거리 (앞쪽 투상평면까지의 거리)
// iFar : 시점에서 관측공간 (=절두체) 뒷부분의 거리 (뒤쪽 투상평면까지의 거리)
//------------------------------------------------------------------------------
- (void)setPerspectiveWithFovy:(GLfloat)iFovy withAspect:(GLfloat)iAspect withNear:(GLfloat)iNear withFar:(GLfloat)iFar
{
  // 시야의 종횡비
  if(iAspect == 0.0) iAspect = self.bounds.size.width / self.bounds.size.height;

  GLfloat iLeftRight = iNear * tanf(DEGREES_TO_RADIANS(iFovy) / 2.0);
  GLfloat iTopBottom = iLeftRight / iAspect;
  glFrustumf(-iLeftRight, iLeftRight, -iTopBottom, iTopBottom, iNear, iFar);
  glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
}

해상도 지정방법

onSurfaceChanged() 에서 지정하는 해상도 관련 설정은 아래와 같이 진행하면 된다.

void onSurfaceChanged(int width, int height)
{
    glMatrixMode(GL_PROJECTION); // 이 명령뒤에 나오는 행렬과 관련된 것은 투영행렬에 영향을 줍니다.
    glLoadIdentity(); // 행렬을 초기화시킵니다.

    glOrthof(0.0f, 480, 800, 0.0f, 1.0f, -1.0f); // 우리는 2D를 만들것이므로 직교투영으로 화면을 지정합니다. 개발자가 원하는 영역을 지정해줍니다.

    glMatrixMode(GL_MODELVIEW); // 이 명령뒤에 나오는 행렬과 관련된 것은 모델뷰행렬에 영향을 줍니다.
    glLoadIdentity(); // 초기화.

    glViewport(0, 0, width, height); // 실제 기기에 보여질 화면영역을 지정해줍니다.
}

여기서 중요한것은 glOrthof()glViewport()이다. 먼저, glOrthof()에 원하는 작업공간크기를 지정하면 된다. "나는 480800 화면을 기준으로 할꺼야." 그러면 위와같이 480, 800을 넣어주면된다. glViewport()에서는 실제 기기의 해상도를 입력해주면 모든 해상도에서 올바른 자리에 출력되는 이미지를 볼수 있다. 1280720 단말에서 돌린다면 480800을 늘려서 1280720해상도에 맞게 그리고 그보다 작다면 축소시켜서 그려준다.

See also

Favorite site

References


  1. IOS_OpenGL_ES_Tutorial_13_-_Perspective_projection.pdf 

  2. Egl_opengles2_tutorials.pdf