모바일/임베디드 환경용 OpenGL 경량 버전. Android/iOS 초기 표준. 현재는 Vulkan/Metal로 대체 중.

 

왜 ES가 따로 존재하는가

 

데스크탑 OpenGL의 문제

-> GPU가 크고 전력 무제한인 환경 전제

-> 기능이 너무 많음 즉, 구현 비용 큼.

-> 즉시 모드 렌더링하기에 비효율적이다

-> 고정 파이프라인은 셰이더 없던 시절의 유산

 

모바일/임베디드 환경의 제약

-> 배터리는 전력 효율이 최우선이다

-> GPU를 연산 최소화해서 발열을 낮추기

-> 수백 MB 수준의 메모리

-> 칩 면적의 GPU 트랜지스터 수 제한

 

OpenGL ES = OpenGL에서 불필요한 것을 제거하고 모바일/임베디드에 맞게 재설계한 것.

 

OpenGL ES 버전별 발전

 

1.0 버전 ( 2003 )

-> 고정 파이프라인만 지원

-> 셰이더 없음

-> 초기 스마트폰, 피처폰

 

2.0 버전 ( 2007 )

-> 프로그래머블 파이프라인 도입

-> GLSL ES 셰이더 지원

-> 고정 파이프라인 완전 제거

-> iPhone 3GS, Android 2.x 시대

-> 현재도 임베디드에서 많이 사용

 

3.0 버전 ( 2012 )

-> 다중 렌더 타깃

-> 컴퓨트 셰이더 일부 기능

-> 인스턴싱 지원

-> 현대 Android의 기준점

 

3.1 버전 ( 2014 )

-> 컴퓨트 셰이더 완전 지원

-> SSBO ( Shader Storage Buffer )

 

3.2 버전 ( 2015 )

-> 지오메트리 셰이더

-> 테셀레이션

-> 데스크탑 OpenGL 4.x에 근접

 

3.2 이후 

-> Vulkan, Metal로 대체 중. 그러나 임베디드에선 여전히 주력이다

 

OpenGL에서 제거된 것들

 

즉시모드 (glBegin/glEnd) -> VBO 사용 강제 -> 오히려 더 효율적

고정 파이프라인(glLightfv, glMaterialfv) -> 셰이더로 대체

glPolygonMode(GL_LINE) -> 와이어프레임 모드 없음

double 정밀도 (GL_DOUBLE) -> float만 지원

glPushMatrix/glPopMatrix -> 행렬 스택 없음. 직접 관리

기하 셰이더 ( ES 3.2 이전 ) -> 제한적 지원

 

제거된 것들이 오히려 더 좋은 설계를 강제한다 즉시 모드가 없으니 VBO를 써야 하고, 고정 파이프라인이 없으니 셰이더를 써야함.

 

OpenGL ES 2.0 기본 렌더링 흐름

// EGL로 디스플레이 연결 (임데디드 환경)
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
eglInitialize(display, NULL, NULL);

// 컨텍스트 생성
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
eglMakeCurrent(display, surface, surface, context);

// 셰이더 작성 (GLSL ES)
const char* vertexShaderSource =
    "#version 100\n" // ES 2.0
    "attribute vec4 aPosition;\n" //attribute = 버텍스 입력
    "attribute vec2 aTexCoord;\n"
    "varying vec2 vTexCoord;\n" // varying = 픽셀 셰이더로 전달
    "uniform mat4 uMVPMatrix;\n"
    "void main() {\n"
    "    gl_Position = uMVPMatrix * aPosition;\n"
    "    vTexCoord = aTexCoord;\n"
    "}\n";
    
const char* fragmentShaderSource = 
    "#version 100\n"
    "precision mediump float;\n" // 정밀도 명시 (ES 필수)
    "varying vec2 vTexCoord;\n"
    "uniform sampler2D uTexture;\n"
    "void main() {\n"
    "    gl_FragColor = texture2D(uTexture, vTexCoord);\n"
    "}\n";
    
// VBO 생성 및 데이터 업로드
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 드로우콜
glDrawArrays(GL_TRIANGLES, 0, 3);

// 프레임 표시
eglSwapBuffers(display, surface);

 

EGL : 임베디드에서 OpenGL ES를 연결하는 레이어

 

일반 데스크탑 OpenGL

-> Windows : WGL (Windows GL)

-> Linux : GLX (X11 GL)

-> macOS : AGL/NSOpenGL

 

임베디드/모바일 EGL ( Embedded-System Graphics Library)

-> Khronos Group이 표준화

-> OpenGL ES, OpenVG, OpenCL의 공통 인터페이스

 

EGL이 하는 일

-> 디스플레이 연결 : eglGetDisplay()

-> 초기화 : eglInitialize()

-> 픽셀 포맷 설정 : eglChooseConfig()

-> 렌더링 서피스 생성 : eglCreateWindowSurface()

-> 컨텍스트 생성 : eglCreateContext()

-> 버퍼 교체 : eglSwapBuffers() <- vsync와 연동

 

임베디드에서 OpenGL ES를 쓰려면 EGL을 이해해야 한다.

 

GLSL ES vs GLSL 셰이더 문법 차이

  GLSL ES 2.0 ( 모바일/임베디드)  GLSL 3.3 (데스크탑)
  #version 100 #version 330 core
정밀도 명시 precision mediump float; (ES 필수) 없음 기본이 high
버텍스 입력 attribute vec3 aPosition; in vec3 aPosition;
픽셀 셰이더로 보내는 값 varying vec2 vTexCoord; out vec2 vTexCoord; (버텍스)
in vec2 vTexCoord; (픽셀)
텍스처 샘플링 texture2D(uTex, vUV) texture(uTex, vUV)
최종 색상 출력 gl_FragColor = color out vec4 FragColor;
FragColor = color;

정밀도 명시가 ES의 특징이다. highp, mediump, lowp 세 가지인데 낮을수록 성능이 높고 정확도가 낮다. 모바일 최적화의 핵심  도구

 

타일 기반 렌더링 ( 모바일 GPU의 핵심 )

 

데스크탑 GPU (Immediate Mode Rendering) : 화면 전체를 GPU VRAM에 올리고 픽셀 하나 처리할 때마다 VRAM 읽기/쓰기

-> 메모리 대역폭 사용량이 큼

-> 전력 소모가 큼

 

모바일 GPU (Tile-Based Deferred Rendering) : 화면을 16x16 또는 32x32 픽셀 타일로 나눈 다음 각 타일을 온칩 고속 메모리(SRAM)에서 처리한다. VRAM 접근은 타일 처리 전/후에만

-> 메모리 대역폭 사용량 90% 감소

-> 전력 효율 극적으로 향상

 

Apple A 시리즈, ARM Mali, Qualcomm Adreno 모두 타일 기반이다

 

OpenGL ES -> Metal/Vulkan이 이 구조를 더 잘 활용한다. Render Pass 개념이 타일 기반 GPU를 위한 설계로 만들어졌다.

 

임베디드 환경에서 OpenGL ES 최적화 (모바일/임베디드 렌더링 최적화 원칙)

 

1. 정밀도를 낮춰라.

highup -> mediump 로 바꾸면 모바일 GPU에서 연산 속도 향상

 

2. 알파 블렌딩을 최소화.

반투명 오브젝트 = 타일 메모리 플러시. 불투명 오브젝트를 먼저 그린다.

 

3. glClear를 만드시 호출

타일 기반 GPU에서 이전 프레임을 지우는 신호로 안 하면 이전 프레임 내용을 로드하는 불필요한 비용이 발생한다

 

4. 텍스처 압축 사용

PVRTC -> PowerVR GPU ( Apple )

ETC2 -> Android 표준 ( OpenGL ES 3.0 필수 )

ASTC -> 현대 모바일 표준 ( ES 3.2 )

 

5. 드로우콜 최소화

모바일 GPU는 드로우콜 오버헤드가 데스크탑보다 더 크다.

 

연결되는 단어들

 

EGL : OpenGL ES와 네이티브 디스플레이를 연결하는 인터페이스. 임베디드 렌더링의 시작점.

 

PVRTC/ETC2/ASTC : 모바일 GPU 전용 텍스처 압축 포맷. GPU 메모리에서도 압축 유지. 모바일 최적화 필수 지식

 

타일 기반 렌더링 (TBDR) : 모바일 GPU의 렌더링 방식. 화면을 타일로 나눠 온칩 메모리에서 처리. Vulkan/Metal Render Pass의 설계 기반

 

Qt + OpenGL ES : 임베디드 HMI 개발의 표준 조합. Qt가 EGL과 OpenGL ES를 추상화해준다. 산업용 디스플레이, 자동차 HMI에 널리 사용된다.

'Word' 카테고리의 다른 글

HLSL/GLSL  (0) 2026.07.16
WebGL / WebGPU  (0) 2026.07.14
Metal  (0) 2026.07.10
Vulkan  (0) 2026.07.09
DirectX/ Direct3D  (0) 2026.07.08

+ Recent posts