모바일/임베디드 환경용 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 |
