OpenGL ES, gömülü ve mobil sistemler için tasarlanmış, açık spesifikasyona sahip bir grafik API'sidir. Programlanabilir gölgelendirici hattı aracılığıyla donanım hızlandırmalı 2D ve 3D grafik işleme sağlar. Khronos Group, 2025'e göre OpenGL ES, dünya çapında 10 milyardan fazla kurulumu destekleyerek mobil cihazlarda en yaygın grafik API'si olmaya devam etmektedir. Kütüphane, oyunlarda, harita hizmetlerinde, AR uygulamalarında ve Android ile iOS arayüzlerinde kullanılmaktadır.
Önemli Noktalar
OpenGL ES (Gömülü Sistemler için Açık Grafik Kütüphanesi), mobil cihazlar, oyun konsolları ve gömülü sistemler için uyarlanmış masaüstü OpenGL API'sinin bir alt kümesidir. Spesifikasyon, Khronos Group konsorsiyumu tarafından geliştirilir ve tüm üreticilere ücretsiz olarak sunulur. Masaüstü OpenGL'den farklı olarak OpenGL ES, sabit işlev hattının eski özelliklerini kaldırır ve yalnızca programlanabilir gölgelendirici hattını bırakır — bu, güç tüketimini azaltır ve sürücüleri basitleştirir.
OpenGL ES'nin ana uygulama alanı gerçek zamanlı grafik işlemedir. API, mobil oyunlarda (Unity, Unreal Engine), navigasyon uygulamalarında, ARCore ve ARKit tabanlı AR çözümlerinde ve ayrıca Android ile iOS sistem arayüzlerinde kullanılır. StatCounter, 2026'ya göre, aktif akıllı telefonlar arasında OpenGL ES 3.0+ desteği olan cihazların oranı %92'yi aşmaktadır.
OpenGL ES'nin temel avantajı platformlar arası uyumluluktur. OpenGL ES ile yazılmış aynı uygulama, minimum değişiklikle Android, iOS, Linux ve Windows'ta çalışabilir. Bu, API'yi grafik motorunu yeniden yazmadan birden çok platformu hedefleyen projeler için optimum bir seçim haline getirir.
OpenGL'nin ilk sürümleri (2.0 öncesi) sabit bir hat kullanıyordu — önceden tanımlanmış bir dizi köşe ve piksel işleme aşaması. Geliştirici yalnızca parametreleri yapılandırabiliyordu: ışık kaynaklarının konumları, malzeme özellikleri, dönüşüm matrisleri. Programlanabilir hat, OpenGL ES 2.0 ile tanıtıldı ve sabit aşamaları gölgelendiricilerle (GPU'da yürütülen küçük programlar) değiştirdi. Bu, geliştiricilere geometri işleme üzerinde tam kontrol sağladı.
Programlanabilir hatta geçiş, mobil grafikler için bir devrimdi. Geliştiriciler karmaşık efektleri uygulama yeteneği kazandı: PBR (Fizik Tabanlı İşleme), dinamik gölgeler, son işleme ve HDR. Sabit hat daha az kod gerektiriyordu ancak benzersiz görsel stiller oluşturmaya izin vermiyordu. Modern mobil oyunlar tamamen programlanabilir hatta çalışır.
Grafik hattı OpenGL ES, köşelerden ekrandaki piksellere giden yolda giriş verilerini dönüştüren birkaç ardışık aşamadan oluşur. Hat mimarisini anlamak, sınırlı enerji ve termal bütçeye sahip mobil cihazlarda işleme performansını optimize etmek için kritiktir.
| Hat Aşaması | Amaç | Programlanabilir |
|---|---|---|
| Köşe Gölgelendirici | Köşe dönüşümü, model-görünüm-projeksiyon matrislerinin uygulanması | Evet — GLSL |
| Mozaikleme | Geometri alt bölümü (yalnızca ES 3.2) | Evet — GLSL |
| Geometri Gölgelendirici | İlkellerden yeni geometri oluşturma | Evet — GLSL |
| Tarama | İlkelleri parçalara (piksellere) dönüştürme | Hayır — sabit |
| Parça Gölgelendirici | Her parçanın rengini hesaplama, doku oluşturma, aydınlatma | Evet — GLSL |
| Parça Başına İşlemler | Derinlik testi, şablon testi, karıştırma, makas testi | Parametre yapılandırması |
İlk aşama — köşe gölgelendirici — her köşeyi bağımsız olarak işler. Bu aşamada dönüşümler uygulanır: modelin yerel uzayından dünya uzayına, ardından kamera uzayına ve son olarak kırpma uzayına (clip space) çeviri. Dönüşümler, kamera veya nesneler hareket ettiğinde her karede güncellenen MVP (Model-Görünüm-Projeksiyon) tek tip matrisleri aracılığıyla ayarlanır.
İlkel montajından (noktalar, çizgiler, üçgenler) sonra, tarama gerçekleştirilir — her ilkelin ekranın hangi piksellerini kapladığını belirleme süreci. Tarayıcı, enterpolasyonlu niteliklerle (renk, normaller, UV koordinatları) parçalar — potansiyel pikseller üretir. Parça sayısı doğrudan ekran çözünürlüğüne ve ilkelin izdüşüm alanına bağlıdır.
Parça gölgelendirici, oluşturulan her parça için yürütülür. Dokuları, ışık kaynaklarını ve malzemeleri dikkate alarak son piksel rengini hesaplar. Parça gölgelendiricinin çıktısı bir dizi parça başına testten geçer: derinlik testi parçanın görünür olup olmadığını belirler; şablon testi maskeyle işlemeyi kısıtlar; karıştırma, parça rengini çerçeve arabelleğinde zaten yazılı olan renkle karıştırır.
OpenGL ES bir durum makinesi olarak çalışır: tüm ayarlar — geçerli gölgelendirici, bağlı dokular, etkin testler — bağlamın genel durumunda saklanır. glEnable, glBindTexture veya glUseProgram aracılığıyla durum değiştirme, sonraki tüm çizim komutlarını etkiler. Her durum değişikliği sürücüde yük oluşturur, bu nedenle çizim çağrılarını duruma göre gruplamak ana optimizasyon tekniğidir.
OpenGL ES 1.0 ve 1.1 (2003–2004'te yayınlandı) sabit hat üzerine kuruluydu. Dönüşümleri, doku oluşturmayı, aydınlatmayı ve karıştırmayı destekliyorlardı ancak gölgelendirici programlamaya izin vermiyorlardı. API, ilk cep telefonlarında ve Symbian ile Windows Mobile tabanlı cihazlarda kullanıldı. Bugün bu sürümler eskimiş kabul edilir — modern cihazlar bunları desteklemez.
OpenGL ES 2.0 (2007), GLSL ES'de köşe ve parça gölgelendiricileriyle programlanabilir bir hat tanıttı. Bu sürüm, Android 2.2+ ve iOS 5+ için standart haline geldi ve hala cihazların büyük çoğunluğu tarafından desteklenmektedir. OpenGL ES 2.0, mobil platformlarda Unity, Unreal Engine ve Cocos2d-x için gereken minimum sürümdür.
OpenGL ES 3.0 (2012), birkaç kritik yetenek ekledi: çoklu işleme hedefleri (MRT), dönüşüm geri bildirimi, örnekleme, ETC2/EAC aracılığıyla isteğe bağlı biçim dokular. Çizim çağrılarının sayısını azaltarak işleme performansı sürüm 2.0'a kıyasla %30–50 arttı. OpenGL ES 3.1 (2014), hesaplama gölgelendiricileri ve atomik arabellek işlemlerini tanıttı — bu, GPU'da yalnızca grafik değil, aynı zamanda hesaplama görevlerinin (son işleme, kumaş simülasyonu, fizik hesaplamaları) yürütülmesini mümkün kıldı.
OpenGL ES 3.2 (2015) — spesifikasyonun en son sürümü — mozaikleme ve geometri gölgelendiricilerinin yanı sıra genişletilmiş bir kayan nokta doku ve karıştırma modu seti ekledi. 2016'da daha modern Vulkan'ın piyasaya sürülmesine rağmen, OpenGL ES 3.2, mevcut devasa kod tabanı ve platformlar arasında uygulama taşıma kolaylığı sayesinde ilgili bir API olmaya devam etmektedir.
| Sürüm | Yıl | Temel Yetenekler | Uyumluluk (2026) |
|---|---|---|---|
| 1.x | 2003 | Sabit hat, aydınlatma, dokular | Eskimiş |
| 2.0 | 2007 | Programlanabilir hat, GLSL ES | %99 cihaz |
| 3.0 | 2012 | MRT, örnekleme, ETC2, dönüşüm geri bildirimi | %92 cihaz |
| 3.1 | 2014 | Hesaplama gölgelendiricileri, atomik arabellekler | %80 cihaz |
| 3.2 | 2015 | Mozaikleme, geometri gölgelendiricileri | %65 cihaz |
GLSL ES (Gömülü Sistemler için OpenGL Gölgelendirme Dili), vektörler ve matrislerle çalışmak için ek türler içeren C sözdizimini temel alan bir gölgelendirici programlama dilidir. Her gölgelendirici, uygulama başlatma aşamasında GPU makine koduna derlenen bir programdır. CPU kodunun aksine, gölgelendiriciler büyük ölçüde paralel olarak yürütülür: binlerce köşe veya parça aynı anda işlenir.
Köşe gölgelendirici, ağın her köşesini işler. Ana görevi, giriş konumunu MVP matrisiyle çarparak kırpma uzayındaki son köşe konumunu hesaplamaktır. Ayrıca, köşe gölgelendirici normalleri, UV koordinatlarını, renkleri hesaplayabilir ve bunları varying değişkenleri aracılığıyla parça gölgelendiriciye iletebilir. Köşe gölgelendiricinin her çağrısı bağımsız çalışır ve GPU'nun kare başına milyonlarca köşeyi işlemesine olanak tanır.
// 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;
}
Parça gölgelendirici, ekrandaki her pikselin rengini belirler. Köşe gölgelendiriciden enterpolasyonlu varying değerleri alır, bağlı dokulardan doku örnekleri alır ve aydınlatma uygular. Doğru aydınlatma için, yaygın, yansıtıcı ve ortam bileşenlerinin hesaplanmasıyla Phong veya Blinn-Phong modeli kullanılır. Parça gölgelendiricinin her çağrısı bir piksele karşılık gelir, bu nedenle toplam çağrı sayısı nesnenin ekrandaki izdüşüm alanına eşittir.
// 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);
}
Yukarıdaki örnekte, parça gölgelendirici UV koordinatlarına göre 2D dokudan doku örneği alır, normal ile ışık yönünün nokta çarpımı olarak yaygın aydınlatmayı hesaplar ve doku rengini aydınlatma yoğunluğuyla çarpar. Mediump, mobil GPU'larda parça gölgelendiriciler için önerilen hassasiyettir: minimum güç tüketimiyle yeterli kalite sağlar.
Android'de OpenGL ES ile çalışmak için, grafiklerin işleneceği bir yüzey olan EGL bağlamı oluşturmak gerekir. iOS'ta, GLKit çerçevesi tarafından sağlanan EAGL katmanı (EGL'ye benzer) kullanılır. Her iki durumda da, başlatma süreci bir pencere yüzeyi oluşturma, bağlam niteliklerini yapılandırma ve geçerli işleme iş parçacığına bağlamayı içerir.
// 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)
}
}
Bağlam oluşturulduktan sonra, geliştirici arabellekleri ayarlamalıdır: köşe arabelleği (VBO) köşe koordinatlarını, normalleri ve UV'yi içerir; indeks arabelleği (EBO), üçgenler oluşturmak için köşe geçiş sırasını tanımlar. VAO (Köşe Dizi Nesnesi), tüm nitelik yapılandırmalarını tek bir nesnede birleştirir ve ağ değiştirirken API çağrılarının sayısını azaltır.
EGL (Yerel Platform Grafik Arayüzü), OpenGL ES ile pencere sistemi arasındaki bir ara katmandır. Android'de EGL, işleme yüzeyinin oluşturulmasını, çerçeve arabelleği yapılandırma seçimini (renk derinliği, şablon, MSAA) ve vsync ile senkronizasyonu yönetir. Tipik bir yapılandırma, 24 bit derinlik arabelleği ve 8 bit şablon arabelleği ile RGBA8888 talep eder. iOS'ta, EGL'nin rolü EAGL tarafından CAEAGLLayer ile birlikte yerine getirilir.
Mobil cihazlarda OpenGL ES performans optimizasyonu birkaç temel uygulamayı içerir. Birçok özdeş nesneyi işlemek için örnekleme (glDrawArraysInstanced) kullanın — bu, çizim çağrılarının sayısını azaltır. Doku havuzları uygulayın ve çizim çağrıları arasında doku değiştirmekten kaçının. Nesneleri gölgelendiriciye, ardından dokuya, ardından ağa göre sıralayın — bu sıra, bağlam durumu değişikliklerini en aza indirir.
Metal, Apple'ın düşük seviyeli grafik API'sidir ve A7 yongasından itibaren iOS ve macOS'ta kullanılabilir. Metal, minimum sürücü yüküyle GPU'ya doğrudan erişim sağlar ancak yalnızca Apple cihazlarında çalışır. WWDC 2024'e göre Metal, çalışma zamanı durum kontrollerini azaltarak aynı donanımda OpenGL ES'ye kıyasla %40'a kadar daha yüksek performans sunar.
Vulkan, Khronos Group tarafından geliştirilen OpenGL ES'nin platformlar arası halefidir. Vulkan, açık kaynak yönetimi kullanır: geliştirici bellek havuzları tahsis eder, komut arabellekleri oluşturur ve GPU erişimini senkronize eder. Bu, performans üzerinde maksimum kontrol sağlar ancak Vulkan başlatma kodu, OpenGL ES'ninkinden 3–4 kat daha fazladır. Vulkan, Android 7+'da AAA oyunlar ve zorlu grafik uygulamaları için önerilir.
OpenGL ES, Metal ve Vulkan arasındaki seçim, hedef platformlara ve performans gereksinimlerine bağlıdır. OpenGL ES, geliştirme hızının önemli olduğu platformlar arası projeler için en iyi seçim olmaya devam etmektedir. Metal, maksimum performans için iOS/macOS ekosistemi için tercih edilir. Vulkan, kare başına her milisaniyenin önemli olduğu ve geliştirme bütçesinin düşük seviyeli optimizasyona yatırım yapmaya izin verdiği projeler için seçimdir.
| Özellik | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Platformlar | Android, iOS, Windows, Linux | Yalnızca iOS, macOS | Android, Windows, Linux (iOS yok) |
| API Seviyesi | Yüksek (durum makinesi) | Orta | Düşük (açık) |
| Başlatma Kodu | 50–100 satır | 100–200 satır | 300–500 satır |
| Bellek Kontrolü | Otomatik | Yarı otomatik | Tamamen manuel |
| Performans | Temel | +%20–40 vs ES | +%30–60 vs ES |
Sıkça Sorulan Sorular
OpenGL ES, sabit hat işlevlerinin eski özelliklerinin kaldırıldığı masaüstü OpenGL'nin bir alt kümesidir. OpenGL ES daha küçük bir spesifikasyon hacmine, basitleştirilmiş bir hassasiyet profiline sahiptir ve mobil cihazların düşük güç tüketimi için optimize edilmiştir.
Android, tüm cihazlarda OpenGL ES 2.0, Android 4.3+'te 3.0, Android 5.0+'ta 3.1, Android 7.0+ olan seçili cihazlarda 3.2'yi destekler. Geçerli destek seviyesi EGL_CONFIG_CAVEAT aracılığıyla kontrol edilebilir.
GLSL ES (Gömülü Sistemler için OpenGL Gölgelendirme Dili), vec2/vec3/vec4/mat4 türlerine ve yerleşik texture, normalize, dot işlevlerine sahip C benzeri bir dildir. ES 3.0+ için #version 300 es yönergesi kullanılır.
Evet, OpenGL ES, geliştirme hızı ve geniş cihaz desteğinin öncelikli olduğu platformlar arası projeler için hala geçerlidir. iOS ekosistemi için Metal öğrenmek daha iyidir; maksimum performanslı yeni projeler için Vulkan kullanın.
Android'de, bağlam oluşturduktan sonra GLES30.glGetString(GLES30.GL_VERSION) çağrısını yapın. Dize, sürüm numarasını ve satıcı bilgilerini içerir. iOS'ta, [EAGLContext currentContext] ve API özelliğini kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.