OpenGL ES: 개념, 아키텍처 및 응용

저자: IT Sectr 게시일: 2026-05-03 읽는 시간: 11 분

OpenGL ES는 임베디드 및 모바일 시스템을 위해 설계된 개방형 사양의 그래픽 API입니다. 프로그래밍 가능한 셰이더 파이프라인을 통해 하드웨어 가속 2D 및 3D 그래픽 렌더링을 제공합니다. Khronos Group, 2025에 따르면, OpenGL ES는 모바일 기기에서 가장 널리 사용되는 그래픽 API로, 전 세계적으로 100억 개 이상의 설치를 지원합니다. 이 라이브러리는 게임, 지도 서비스, AR 애플리케이션 및 Android와 iOS의 인터페이스에서 사용됩니다.

주요 내용

  • OpenGL ES는 모바일 및 임베디드 기기를 위한 크로스 플랫폼 그래픽 API로, 업계의 사실상 표준입니다
  • 프로그래밍 가능한 파이프라인에는 GLSL로 작성된 버텍스, 프래그먼트 및 컴퓨트 셰이더가 포함됩니다
  • 버전 OpenGL ES 2.0, 3.0 및 3.2는 사용 가능한 기능 세트를 정의하며, 각 후속 버전은 셰이더 단계와 성능 향상을 추가합니다
  • EGL은 OpenGL ES를 특정 플랫폼(Android, iOS, Windows)의 창 시스템에 연결하는 중간 계층입니다
  • Metal과 Vulkan은 더 낮은 수준의 대안으로 오버헤드는 적지만 초기화에 더 많은 코드가 필요합니다

OpenGL ES란?

OpenGL ES(임베디드 시스템을 위한 Open Graphics Library)는 모바일 기기, 게임 콘솔 및 임베디드 시스템에 맞게 조정된 데스크톱 OpenGL API의 하위 집합입니다. 사양은 Khronos Group 컨소시엄에 의해 개발되며 모든 제조업체에 무료로 제공됩니다. 데스크톱 OpenGL과 달리 OpenGL ES는 고정 기능 파이프라인의 레거시 기능을 제거하고 프로그래밍 가능한 셰이더 파이프라인만 남깁니다. 이를 통해 전력 소비를 줄이고 드라이버를 단순화합니다.

OpenGL ES의 주요 적용 분야는 실시간 그래픽 렌더링입니다. 이 API는 모바일 게임(Unity, Unreal Engine), 내비게이션 애플리케이션, ARCore 및 ARKit 기반 AR 솔루션, 그리고 Android 및 iOS 시스템 인터페이스에서 사용됩니다. StatCounter, 2026에 따르면, 활성 스마트폰 중 OpenGL ES 3.0+를 지원하는 기기의 비율은 92%를 초과합니다.

OpenGL ES의 주요 장점은 크로스 플랫폼 호환성입니다. OpenGL ES로 작성된 동일한 애플리케이션은 최소한의 변경으로 Android, iOS, Linux 및 Windows에서 실행될 수 있습니다. 이는 그래픽 엔진을 다시 작성하지 않고 여러 플랫폼을 대상으로 하는 프로젝트에 최적의 선택이 됩니다.

고정 기능 vs 프로그래밍 가능한 파이프라인

초기 OpenGL 버전(2.0 이전)은 고정 기능 파이프라인을 사용했습니다. 이는 버텍스 및 픽셀 처리를 위한 미리 정의된 일련의 단계입니다. 개발자는 매개변수(광원 위치, 재질 속성, 변환 행렬)만 구성할 수 있었습니다. 프로그래밍 가능한 파이프라인은 OpenGL ES 2.0에서 도입되어 고정 단계를 셰이더(GPU에서 실행되는 작은 프로그램)로 대체했습니다. 이를 통해 개발자는 지오메트리 렌더링을 완전히 제어할 수 있게 되었습니다.

프로그래밍 가능한 파이프라인으로의 전환은 모바일 그래픽에 혁명이었습니다. 개발자는 복잡한 효과를 구현할 수 있게 되었습니다: PBR(물리 기반 렌더링), 동적 그림자, 후처리 및 HDR. 고정 기능 파이프라인은 코드가 덜 필요했지만 고유한 시각적 스타일을 만들 수 없었습니다. 현대 모바일 게임은 완전히 프로그래밍 가능한 파이프라인에서 작동합니다.

OpenGL ES 아키텍처: 렌더링 파이프라인

그래픽 파이프라인 OpenGL ES는 버텍스에서 화면의 픽셀까지의 경로에서 입력 데이터를 변환하는 여러 순차적 단계로 구성됩니다. 파이프라인 아키텍처를 이해하는 것은 제한된 에너지 및 열 예산을 가진 모바일 기기에서 렌더링 성능을 최적화하는 데 중요합니다.

파이프라인 단계목적프로그래밍 가능
버텍스 셰이더버텍스 변환, 모델-뷰-프로젝션 행렬 적용예 — GLSL
테셀레이션지오메트리 세분화(ES 3.2만)예 — GLSL
지오메트리 셰이더프리미티브에서 새 지오메트리 생성예 — GLSL
래스터라이제이션프리미티브를 프래그먼트(픽셀)로 변환아니오 — 고정
프래그먼트 셰이더각 프래그먼트의 색상 계산, 텍스처링, 조명예 — GLSL
프래그먼트별 연산깊이 테스트, 스텐실 테스트, 블렌딩, 시저 테스트매개변수 구성

첫 번째 단계인 버텍스 셰이더는 각 버텍스를 독립적으로 처리합니다. 이 단계에서는 변환이 적용됩니다: 모델 로컬 공간에서 월드 공간, 카메라 공간, 그리고 클립 공간으로의 변환입니다. 변환은 카메라나 객체가 움직일 때마다 매 프레임 업데이트되는 MVP(모델-뷰-프로젝션) 유니폼 행렬을 통해 설정됩니다.

프리미티브 조립(점, 선, 삼각형) 후, 래스터라이제이션이 수행됩니다. 이는 각 프리미티브가 화면의 어떤 픽셀을 덮는지 결정하는 프로세스입니다. 래스터라이저는 보간된 속성(색상, 법선, UV 좌표)을 가진 프래그먼트(잠재적 픽셀)를 생성합니다. 프래그먼트의 수는 화면 해상도와 프리미티브의 투영 면적에 직접적으로 의존합니다.

프래그먼트 셰이더는 생성된 각 프래그먼트에 대해 실행됩니다. 텍스처, 광원 및 재질을 고려하여 최종 픽셀 색상을 계산합니다. 프래그먼트 셰이더의 출력은 일련의 프래그먼트별 테스트를 통과합니다: 깊이 테스트는 프래그먼트가 보이는지 결정하고, 스텐실 테스트는 마스크로 렌더링을 제한하며, 블렌딩은 프래그먼트 색상을 프레임버퍼에 이미 쓰여진 색상과 혼합합니다.

OpenGL ES 컨텍스트 상태

OpenGL ES는 상태 기계로 작동합니다: 모든 설정(현재 셰이더, 바인딩된 텍스처, 활성화된 테스트)은 컨텍스트의 전역 상태에 저장됩니다. glEnable, glBindTexture 또는 glUseProgram을 통한 상태 변경은 이후의 모든 드로우 명령에 영향을 미칩니다. 각 상태 전환은 드라이버에서 오버헤드를 발생시키므로, 상태별로 드로우 호출을 그룹화하는 것이 주요 최적화 기술입니다.

OpenGL ES 버전 및 기능

OpenGL ES 1.0 및 1.1(2003~2004년 출시)은 고정 기능 파이프라인을 기반으로 했습니다. 변환, 텍스처링, 조명 및 블렌딩을 지원했지만 셰이더 프로그래밍은 허용하지 않았습니다. 이 API는 초기 휴대폰과 Symbian 및 Windows Mobile 기반 기기에서 사용되었습니다. 현재 이러한 버전은 구식으로 간주되며 최신 기기는 이를 지원하지 않습니다.

OpenGL ES 2.0(2007)은 GLSL ES에서 버텍스 및 프래그먼트 셰이더를 갖춘 프로그래밍 가능한 파이프라인을 도입했습니다. 이 버전은 Android 2.2+ 및 iOS 5+의 표준이 되었으며 현재도 대다수 기기에서 지원됩니다. OpenGL ES 2.0은 모바일 플랫폼에서 Unity, Unreal Engine 및 Cocos2d-x에 필요한 최소 버전입니다.

OpenGL ES 3.0(2012)은 여러 중요한 기능을 추가했습니다: 다중 렌더 타겟(MRT), 트랜스폼 피드백, 인스턴싱, ETC2/EAC를 통한 임의 형식 텍스처. 드로우 호출 수를 줄여 렌더링 성능이 버전 2.0 대비 30~50% 향상되었습니다. OpenGL ES 3.1(2014)은 컴퓨트 셰이더와 원자 버퍼 연산을 도입하여 GPU에서 그래픽뿐만 아니라 컴퓨트 작업(후처리, 천 시뮬레이션, 물리 계산)도 실행할 수 있게 되었습니다.

OpenGL ES 3.2(2015) — 사양의 최신 버전 — 테셀레이션 및 지오메트리 셰이더와 확장된 플로트 텍스처 및 블렌드 모드 세트를 추가했습니다. 2016년에 더 현대적인 Vulkan이 출시되었음에도 불구하고, OpenGL ES 3.2는 방대한 기존 코드베이스와 플랫폼 간 애플리케이션 이식의 용이성 덕분에 여전히 중요한 API로 남아 있습니다.

버전연도주요 기능호환성(2026)
1.x2003고정 기능 파이프라인, 조명, 텍스처구식
2.02007프로그래밍 가능한 파이프라인, GLSL ES99% 기기
3.02012MRT, 인스턴싱, ETC2, 트랜스폼 피드백92% 기기
3.12014컴퓨트 셰이더, 원자 버퍼80% 기기
3.22015테셀레이션, 지오메트리 셰이더65% 기기

OpenGL ES의 셰이더: GLSL 및 프로그래밍 가능한 파이프라인

GLSL ES(임베디드 시스템을 위한 OpenGL 셰이딩 언어)는 C 구문을 기반으로 벡터 및 행렬 작업을 위한 추가 유형이 있는 셰이더 프로그래밍 언어입니다. 각 셰이더는 애플리케이션 초기화 시 GPU 기계 코드로 컴파일되는 프로그램입니다. CPU 코드와 달리 셰이더는 대규모 병렬로 실행되며 수천 개의 버텍스 또는 프래그먼트가 동시에 처리됩니다.

버텍스 셰이더

버텍스 셰이더는 메시의 각 버텍스를 처리합니다. 주요 작업은 입력 위치를 MVP 행렬로 곱하여 클립 공간에서 최종 버텍스 위치를 계산하는 것입니다. 또한 버텍스 셰이더는 법선, UV 좌표, 색상을 계산하고 varying 변수를 통해 프래그먼트 셰이더로 전달할 수 있습니다. 각 버텍스 셰이더 호출은 독립적으로 작동하여 GPU가 프레임당 수백만 개의 버텍스를 처리할 수 있습니다.

glsl
// Simple vertex shader for OpenGL ES 3.0
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_normal;
layout(location = 2) in vec2 a_texCoord;

uniform mat4 u_mvpMatrix;

out vec3 v_normal;
out vec2 v_texCoord;

void main() {
    gl_Position = u_mvpMatrix * a_position;
    v_normal = mat3(u_mvpMatrix) * a_normal;
    v_texCoord = a_texCoord;
}

프래그먼트 셰이더

프래그먼트 셰이더는 화면의 각 픽셀 색상을 결정합니다. 버텍스 셰이더에서 보간된 varying 값을 받고 바인딩된 텍스처에서 텍셀을 샘플링하며 조명을 적용합니다. 올바른 조명을 위해 확산, 반사 및 환경 성분 계산과 함께 퐁 또는 블린-퐁 모델이 사용됩니다. 각 프래그먼트 셰이더 호출은 하나의 픽셀에 해당하므로 총 호출 수는 화면에서 객체의 투영 면적과 같습니다.

glsl
// Simple fragment shader with texture and lighting
#version 300 es
precision mediump float;

in vec3 v_normal;
in vec2 v_texCoord;

uniform sampler2D u_texture;
uniform vec3 u_lightDir;

out vec4 fragColor;

void main() {
    vec4 texel = texture(u_texture, v_texCoord);
    vec3 normal = normalize(v_normal);
    float diffuse = max(dot(normal, u_lightDir), 0.0);
    fragColor = vec4(texel.rgb * diffuse, texel.a);
}

위 예제에서 프래그먼트 셰이더는 UV 좌표로 2D 텍스처에서 텍셀을 샘플링하고, 법선과 광원 방향의 내적으로 확산 조명을 계산하며, 텍셀 색상에 조명 강도를 곱합니다. Mediump는 모바일 GPU에서 프래그먼트 셰이더에 권장되는 정밀도로, 최소 전력 소비로 충분한 품질을 제공합니다.

모바일 프로젝트에서 OpenGL ES 시작하기

Android에서 OpenGL ES로 작업하려면 EGL 컨텍스트(그래픽이 렌더링되는 표면)를 생성해야 합니다. iOS에서는 GLKit 프레임워크에서 제공하는 EAGL 레이어(EGL과 유사)가 사용됩니다. 두 경우 모두 초기화 프로세스에는 창 표면 생성, 컨텍스트 속성 구성 및 현재 렌더링 스레드에 바인딩이 포함됩니다.

kotlin
// OpenGL ES 3.0 initialization on Android
class MyGLRenderer : GLSurfaceView.Renderer {

    private val vertexShaderCode = "#version 300 es\n..."
    private val fragmentShaderCode = "#version 300 es\n..."

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES30.glClearColor(0.1f, 0.1f, 0.2f, 1.0f)
        GLES30.glEnable(GLES30.GL_DEPTH_TEST)
    }

    override fun onDrawFrame(gl: GL10?) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT or GLES30.GL_DEPTH_BUFFER_BIT)
        // bind VBO, set uniforms, draw elements
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
    }
}

컨텍스트 생성 후 개발자는 버퍼를 설정해야 합니다: 버텍스 버퍼(VBO)에는 버텍스 좌표, 법선 및 UV가 포함되고, 인덱스 버퍼(EBO)는 삼각형을 형성하기 위한 버텍스 순회 순서를 정의합니다. VAO(버텍스 배열 객체)는 모든 속성 구성을 하나의 객체로 결합하여 메시 전환 시 API 호출 수를 줄입니다.

EGL 컨텍스트 설정

EGL(네이티브 플랫폼 그래픽 인터페이스)은 OpenGL ES와 창 시스템 사이의 중간 계층입니다. Android에서 EGL은 렌더링 표면 생성, 프레임버퍼 구성 선택(색상 깊이, 스텐실, MSAA) 및 vsync 동기화를 관리합니다. 일반적인 구성은 24비트 깊이 버퍼와 8비트 스텐실 버퍼가 있는 RGBA8888을 요청합니다. iOS에서 EGL의 역할은 EAGL이 CAEAGLLayer와 함께 수행합니다.

모바일 기기에서 OpenGL ES 성능 최적화에는 여러 주요 방법이 포함됩니다. 여러 동일한 객체를 렌더링하려면 인스턴싱(glDrawArraysInstanced)을 사용하여 드로우 호출 수를 줄입니다. 텍스처 풀을 적용하고 드로우 호출 간 텍스처 전환을 피합니다. 객체를 셰이더, 텍스처, 메시 순서로 정렬하면 컨텍스트 상태 전환이 최소화됩니다.

OpenGL ES vs Metal vs Vulkan

Metal은 Apple의 저수준 그래픽 API로, A7 칩부터 iOS 및 macOS에서 사용할 수 있습니다. Metal은 최소한의 드라이버 오버헤드로 GPU에 직접 액세스할 수 있지만 Apple 기기에서만 작동합니다. WWDC 2024에 따르면, Metal은 런타임 상태 검사를 줄여 동일한 하드웨어에서 OpenGL ES보다 최대 40% 더 높은 성능을 제공합니다.

Vulkan은 Khronos Group이 개발한 OpenGL ES의 크로스 플랫폼 후속 제품입니다. Vulkan은 명시적 리소스 관리를 사용합니다: 개발자가 메모리 풀을 할당하고 명령 버퍼를 생성하며 GPU 액세스를 동기화합니다. 이는 성능에 대한 최대 제어를 제공하지만 Vulkan 초기화 코드는 OpenGL ES보다 3~4배 더 많습니다. Vulkan은 Android 7+에서 AAA 게임 및 까다로운 그래픽 애플리케이션에 권장됩니다.

OpenGL ES, Metal 및 Vulkan 간의 선택은 대상 플랫폼과 성능 요구 사항에 따라 다릅니다. OpenGL ES는 개발 속도가 중요한 크로스 플랫폼 프로젝트에 가장 적합한 선택입니다. Metal은 최대 성능을 위한 iOS/macOS 생태계에 선호됩니다. Vulkan은 프레임당 모든 밀리초가 중요하고 개발 예산이 저수준 최적화에 투자할 수 있는 프로젝트를 위한 선택입니다.

특성OpenGL ESMetalVulkan
플랫폼Android, iOS, Windows, LinuxiOS, macOS만Android, Windows, Linux(iOS 없음)
API 수준높음(상태 기계)중간낮음(명시적)
초기화 코드50~100줄100~200줄300~500줄
메모리 제어자동반자동완전 수동
성능기준+20~40% vs ES+30~60% vs ES

자주 묻는 질문

OpenGL과 OpenGL ES의 차이점은 무엇인가요?

OpenGL ES는 데스크톱 OpenGL의 하위 집합으로, 고정 기능 파이프라인의 레거시 기능이 제거되었습니다. OpenGL ES는 사양 볼륨이 더 작고 정밀도 프로필이 단순화되었으며 모바일 기기의 낮은 전력 소비에 최적화되어 있습니다.

Android에서 지원하는 OpenGL ES 버전은 무엇인가요?

Android는 모든 기기에서 OpenGL ES 2.0, Android 4.3+에서 3.0, Android 5.0+에서 3.1, Android 7.0+가 있는 일부 기기에서 3.2를 지원합니다. 현재 지원 수준은 EGL_CONFIG_CAVEAT를 통해 확인할 수 있습니다.

OpenGL ES 셰이더를 작성하는 데 어떤 언어가 사용되나요?

GLSL ES(임베디드 시스템을 위한 OpenGL 셰이딩 언어)는 vec2/vec3/vec4/mat4 유형과 내장 함수 texture, normalize, dot이 있는 C 유사 언어입니다. ES 3.0+에서는 #version 300 es 지시문이 사용됩니다.

2026년에 OpenGL ES를 배워야 하나요?

네, OpenGL ES는 개발 속도와 광범위한 기기 지원이 우선시되는 크로스 플랫폼 프로젝트에서 여전히 중요합니다. iOS 생태계에서는 Metal을 배우는 것이 좋습니다. 최대 성능을 위한 새 프로젝트에서는 Vulkan을 사용하세요.

기기에서 OpenGL ES 버전을 확인하는 방법은?

Android에서는 컨텍스트 생성 후 GLES30.glGetString(GLES30.GL_VERSION)을 호출하세요. 문자열에는 버전 번호와 공급업체 정보가 포함됩니다. iOS에서는 [EAGLContext currentContext]와 API 속성을 사용하세요.

요약

  • OpenGL ES는 모바일 기기를 위한 기본 그래픽 API로, 100억 개 이상의 설치에서 지원됩니다
  • 프로그래밍 가능한 파이프라인은 GLSL ES의 버텍스 및 프래그먼트 셰이더로 렌더링을 완전히 제어합니다
  • 버전 2.0, 3.0, 3.1, 3.2는 셰이더 단계 세트와 사용 가능한 기능이 다릅니다
  • EGL은 OpenGL ES를 창 시스템에 연결하고 렌더링 표면과 동기화를 관리합니다
  • Metal과 Vulkan은 더 높은 성능의 대안이지만 더 많은 코드가 필요하고 플랫폼에 특화되어 있습니다
  • 최적화에는 인스턴싱, 상태별 드로우 호출 정렬 및 텍스처 풀이 포함됩니다
  • 크로스 플랫폼 프로젝트의 경우 OpenGL ES는 단순성과 성숙한 생태계 덕분에 최적의 선택입니다

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기