f8b21af4be
10_Wiki/Topics 대규모 정리: - 오류 캡처/미완성 stub 문서 227개 제거 - 교차폴더 중복 43클러스터 병합 (63파일 → redirect) - 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건 - 카테고리 MOC 6개 신규 생성 - Graph 섹션 미해결 related-keyword 링크 10,058건 제거 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
207 lines
6.8 KiB
Markdown
207 lines
6.8 KiB
Markdown
---
|
|
id: wiki-2026-0508-opengl-es
|
|
title: OpenGL ES
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [GLES, OpenGL for Embedded Systems]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.9
|
|
verification_status: applied
|
|
tags: [graphics, mobile, gpu, rendering]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: GLSL
|
|
framework: OpenGL ES 3.2
|
|
---
|
|
|
|
# OpenGL ES
|
|
|
|
## 매 한 줄
|
|
> **"매 mobile/embedded GPU 의 lingua franca — 2026 에도 매 Android/legacy iOS 매 핵심 graphics API"**. Khronos Group 매 2003 발표 이래로 매 모바일 3D rendering standard, 매 modern Vulkan 으로 매 점진적 migration 진행 중이지만 매 GLES 3.2 매 widespread support (99%+ Android devices).
|
|
|
|
## 매 핵심
|
|
|
|
### 매 versions
|
|
- **GLES 1.x** (2003): Fixed-function pipeline. 매 deprecated.
|
|
- **GLES 2.0** (2007): Programmable shaders (vertex + fragment). 매 baseline.
|
|
- **GLES 3.0** (2012): Transform feedback, instancing, MSAA, ETC2 textures.
|
|
- **GLES 3.1** (2014): Compute shaders, indirect draws, SSBO.
|
|
- **GLES 3.2** (2015): Geometry/tessellation shaders, ASTC, debug output.
|
|
|
|
### 매 platform support
|
|
- **Android**: 매 native API (NDK + EGL). 매 99%+ devices support GLES 3.0+.
|
|
- **iOS**: 매 deprecated since iOS 12 (Metal preferred), 매 still functional.
|
|
- **WebGL**: 매 GLES 2.0/3.0 subset over JavaScript.
|
|
- **Embedded Linux**: 매 Mali/Adreno/PowerVR drivers.
|
|
|
|
### 매 응용
|
|
1. Mobile games (Unity/Unreal default backend on legacy Android).
|
|
2. Map rendering (Mapbox GL, Google Maps).
|
|
3. AR frameworks (ARCore rendering layer).
|
|
4. Video filters (Snapchat, Instagram shaders).
|
|
|
|
## 💻 패턴
|
|
|
|
### EGL context init (Android NDK)
|
|
```c
|
|
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
eglInitialize(display, NULL, NULL);
|
|
|
|
EGLint attribs[] = {
|
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
|
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
|
EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8,
|
|
EGL_DEPTH_SIZE, 24,
|
|
EGL_NONE
|
|
};
|
|
EGLConfig config;
|
|
EGLint num_configs;
|
|
eglChooseConfig(display, attribs, &config, 1, &num_configs);
|
|
|
|
EGLint ctx_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
|
|
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctx_attribs);
|
|
EGLSurface surface = eglCreateWindowSurface(display, config, native_window, NULL);
|
|
eglMakeCurrent(display, surface, surface, context);
|
|
```
|
|
|
|
### Vertex + fragment shader (GLES 3.0)
|
|
```glsl
|
|
// vertex.glsl
|
|
#version 300 es
|
|
layout(location = 0) in vec3 a_position;
|
|
layout(location = 1) in vec2 a_uv;
|
|
uniform mat4 u_mvp;
|
|
out vec2 v_uv;
|
|
void main() {
|
|
v_uv = a_uv;
|
|
gl_Position = u_mvp * vec4(a_position, 1.0);
|
|
}
|
|
|
|
// fragment.glsl
|
|
#version 300 es
|
|
precision mediump float;
|
|
in vec2 v_uv;
|
|
uniform sampler2D u_tex;
|
|
out vec4 fragColor;
|
|
void main() {
|
|
fragColor = texture(u_tex, v_uv);
|
|
}
|
|
```
|
|
|
|
### Shader compile + link
|
|
```c
|
|
GLuint compile(GLenum type, const char *src) {
|
|
GLuint s = glCreateShader(type);
|
|
glShaderSource(s, 1, &src, NULL);
|
|
glCompileShader(s);
|
|
GLint ok; glGetShaderiv(s, GL_COMPILE_STATUS, &ok);
|
|
if (!ok) { char log[512]; glGetShaderInfoLog(s, 512, NULL, log); LOGE("%s", log); }
|
|
return s;
|
|
}
|
|
GLuint vs = compile(GL_VERTEX_SHADER, vsrc);
|
|
GLuint fs = compile(GL_FRAGMENT_SHADER, fsrc);
|
|
GLuint prog = glCreateProgram();
|
|
glAttachShader(prog, vs); glAttachShader(prog, fs);
|
|
glLinkProgram(prog);
|
|
```
|
|
|
|
### VBO + VAO setup (GLES 3.0)
|
|
```c
|
|
GLuint vao, vbo;
|
|
glGenVertexArrays(1, &vao);
|
|
glGenBuffers(1, &vbo);
|
|
glBindVertexArray(vao);
|
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)0);
|
|
glEnableVertexAttribArray(0);
|
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float)));
|
|
glEnableVertexAttribArray(1);
|
|
```
|
|
|
|
### Texture upload
|
|
```c
|
|
GLuint tex;
|
|
glGenTextures(1, &tex);
|
|
glBindTexture(GL_TEXTURE_2D, tex);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glGenerateMipmap(GL_TEXTURE_2D);
|
|
```
|
|
|
|
### Compute shader (GLES 3.1+)
|
|
```glsl
|
|
#version 310 es
|
|
layout(local_size_x = 16, local_size_y = 16) in;
|
|
layout(rgba8, binding = 0) uniform image2D u_img;
|
|
void main() {
|
|
ivec2 p = ivec2(gl_GlobalInvocationID.xy);
|
|
vec4 c = imageLoad(u_img, p);
|
|
imageStore(u_img, p, vec4(1.0 - c.rgb, c.a)); // invert
|
|
}
|
|
```
|
|
```c
|
|
glUseProgram(compute_prog);
|
|
glBindImageTexture(0, tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
|
|
glDispatchCompute(w/16, h/16, 1);
|
|
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
|
|
```
|
|
|
|
### Framebuffer object (offscreen render)
|
|
```c
|
|
GLuint fbo, color, depth;
|
|
glGenFramebuffers(1, &fbo);
|
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
glGenTextures(1, &color);
|
|
glBindTexture(GL_TEXTURE_2D, color);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
|
|
glGenRenderbuffers(1, &depth);
|
|
glBindRenderbuffer(GL_RENDERBUFFER, depth);
|
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, w, h);
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth);
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 상황 | Approach |
|
|
|---|---|
|
|
| New mobile project (2026) | Vulkan (Android) / Metal (iOS) |
|
|
| Cross-platform legacy support | OpenGL ES 3.0 |
|
|
| Web target | WebGL 2.0 (GLES 3.0 subset) / WebGPU |
|
|
| Compute on mobile | GLES 3.1 compute or Vulkan compute |
|
|
| Maximum device reach | GLES 2.0 (단 functionality 제약) |
|
|
|
|
**기본값**: 매 new code 매 Vulkan, 매 legacy support 매 GLES 3.0.
|
|
|
|
## 🔗 Graph
|
|
- 부모: [[GPU-Programming]]
|
|
- 변형: [[Vulkan]] · [[Metal]] · [[WebGL]] · [[WebGPU]]
|
|
- 응용: [[Mobile-Augmented-Reality]]
|
|
- Adjacent: [[GLSL]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: 매 cross-platform mobile graphics, 매 WebGL/embedded targeting, 매 legacy Android (API < 24) 매 support 필요.
|
|
**언제 X**: 매 modern Android-only (Vulkan), 매 iOS-only (Metal), 매 desktop-first (Vulkan/DX12).
|
|
|
|
## ❌ 안티패턴
|
|
- **glGetError 매 polling 매 hot loop**: 매 sync stall — 매 KHR_debug callback 사용.
|
|
- **매 frame VBO 매 recreate**: 매 GPU memory thrash — 매 persistent buffer + glBufferSubData.
|
|
- **precision highp 매 fragment shader 남용**: 매 mobile GPU 성능 hit — 매 mediump default.
|
|
- **immediate mode mindset**: 매 GLES 매 retained mode — 매 batch draw calls.
|
|
- **driver-specific extensions 의존**: 매 portability 깨짐 — 매 core spec 우선.
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (Khronos OpenGL ES 3.2 spec, Android NDK docs).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — full GLES API guide with EGL/shader/compute patterns |
|