Offscreen Rendering (ekran dışı oluşturma), bir 3D sahnesini ekrana değil, daha sonra doku olarak kullanılabilen bir doku tamponuna (FBO — Framebuffer Object) oluşturma tekniğidir. Apple Metal Documentation, 2025'e göre, ekran dışı oluşturma gölgeler, yansımalar, son efektler ve grafik ön işleme için kullanılır. Offscreen Rendering, karmaşık bir sahneyi kalite kaybı olmadan geçişlere (passes) bölmeye olanak tanır.
Önemli Noktalar
Offscreen Rendering, grafik içeriğini ekranda görüntülenen ana framebuffer yerine video belleğindeki bir ara tampona oluşturma yöntemidir. Ekran dışı oluşturmanın sonucu bir doku veya renderbuffer olarak kaydedilir.
Ekran dışı oluşturmanın temel amacı çok geçişli oluşturmadır (multi-pass rendering). Karmaşık bir sahne birden çok geçişe bölünür: önce sahne bir dokuya (offscreen) oluşturulur, ardından bu doku bir sonraki geçiş için girdi olarak kullanılır ve nihai görüntü elde edilene kadar bu şekilde devam eder. Bu yaklaşım, tek bir geçişte imkansız olan efektlerin elde edilmesini sağlar.
OpenGL ES'de ekran dışı oluşturmanın ana mekanizması Framebuffer Object (FBO)'dir. FBO, doku görüntülerinin veya renderbuffer nesnelerinin eklenebileceği bir kapsayıcıdır. FBO bağlandıktan sonra, sonraki tüm oluşturma komutları ekran yerine ekli dokuya yönlendirilir.
Offscreen Rendering, ayrı bir framebuffer nesnesi oluşturarak, ona bir doku veya renderbuffer ekleyerek, oluşturma bağlamını bu FBO'ya geçirerek ve çizim komutlarını yürüterek uygulanır. Geçiş tamamlandıktan sonra bağlam ana framebuffer'a geri döner.
Süreç üç adımdan oluşur: FBO oluşturma ve doku ekleme — sahneyi ekran dışı dokuya oluşturma — sonuçtaki dokuyu sonraki geçişte kullanma. GL_COLOR_ATTACHMENT0, oluşturmanın hangi renk dokusuna yapılacağını belirler.
// Ekran dışı oluşturma için FBO oluşturma (OpenGL ES 3.0)
GLuint fbo, offscreenTex;
glGenFramebuffers(1, &fbo);
glGenTextures(1, &offscreenTex);
glBindTexture(GL_TEXTURE_2D, offscreenTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER),
GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
offscreenTex, 0);
Offscreen Rendering çok çeşitli grafik efektleri için kullanılır. Her teknik, bir veya daha fazla ekran dışı geçiş ve belirli bir FBO yapılandırması gerektirir.
| Teknik | Geçiş sayısı | Amaç |
|---|---|---|
| Shadow Mapping | 2+ | Işık kaynağından gölge haritası oluşturma |
| Reflection Mapping | 1-2 | Yansımaları küp haritasına oluşturma |
| Bloom Effect | 3-5 | Görüntünün parlak alanlarında parlama |
| HDR Rendering | 2 | HDR görüntüler için ton eşleme |
| Depth Prepass | 1 | Derinlik tamponunu önceden doldurma |
Oluşturma sonucunun daha sonra kullanılmak üzere bir dokuda kaydedildiği temel bir tekniktir. Render-to-Texture, mini haritalar, dinamik nesnelerin dokuları ve karmaşık malzemelerin ön görselleştirmesi için kullanılır.
Karmaşık efektler (HDR, bloom, depth of field) birden çok sıralı geçiş gerektirir. Her geçiş sahneyi ekran dışı bir dokuya oluşturur, bir filtre uygular ve sonucu bir sonraki geçişe iletir. Bu yaklaşım, nihai görüntü kalitesinden ödün vermeden efektleri biriktirmeye olanak tanır.
Shadow Mapping, ekran dışı oluşturma kullanımının klasik bir örneğidir. Gölge iki geçişte oluşturulur: önce sahne ışık kaynağının bakış açısından bir derinlik dokusuna (offscreen) oluşturulur, ardından ana oluşturma sırasında her parça bu derinlik haritasıyla karşılaştırılarak gölgede olup olmadığı belirlenir.
İlk geçiş: kamera ışık kaynağının konumuna yerleştirilir, sahne ekran dışı bir tampona oluşturulur ve yalnızca derinlik dokuya kaydedilir. İkinci geçiş: her parçanın kontrol edildiği ana oluşturma — derinliği derinlik haritasındaki değerden büyükse, parça gölgelenir.
// Gölge haritalama için Fragment Shader
in vec4 vShadowCoord;
uniform sampler2D uShadowMap;
float calcShadow(vec4 coord) {
vec3 uvw = coord.xyz / coord.w;
float depth = texture(uShadowMap, uvw.xy).r;
return (uvw.z > depth + 0.005) ? 0.3 : 1.0;
}
Offscreen Rendering ek GPU geçişleri ekleyerek genel hesaplama yükünü ve güç tüketimini artırır. Mobil geliştirmede bu özellikle kritiktir: her FBO değişimi bir pipeline flush'ı ve ek süre gerektirir.
Mobil cihazlar için öneriler: sonucun okunması gerekmiyorsa doku yerine renderbuffer kullanın (yalnızca derinlik geçişi); ekran dışı dokular için minimum gerekli çözünürlüğü seçin; mümkün olduğunda MRT (Multiple Render Targets) ile geçişleri birleştirin.
Offscreen Rendering farklı platformlarda kendi API'leri aracılığıyla uygulanır. OpenGL ES ve Apple Metal için örneklere bakalım.
// FBO kurulumu ve sahnenin dokuya oluşturulması
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, texWidth, texHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(offscreenProgram);
glBindVertexArray(sceneVAO);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
// Varsayılan framebuffer'a geri dönme
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: dokuya ekran dışı oluşturma geçişi
MTLRenderPassDescriptor passDesc = [MTLRenderPassDescriptor renderPassDescriptor];
passDesc.colorAttachments[0].texture = offscreenTexture;
passDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
passDesc.colorAttachments[0].clearColor =
MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
id<MTLCommandBuffer> cmdBuffer = [commandQueue commandBuffer];
id<MTLRenderCommandEncoder> enc =
[cmdBuffer renderCommandEncoderWithDescriptor:passDesc];
[enc drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:indexCount
indexType:MTLIndexTypeUInt16
indexBuffer:indexBuffer
indexBufferOffset:0];
[enc endEncoding];
Sıkça Sorulan Sorular
Offscreen Rendering, grafiklerin ekrana değil, görünmez bir tampona (doku) çizilmesidir. Bu tampon daha sonra diğer efektler için doku olarak kullanılır. Şeffaf bir sayfaya çizim yaptığınızı ve bunu nihai görüntünün üzerine yerleştirdiğinizi hayal edin.
Ekran dışı oluşturma, tek bir geçişte imkansız olan efektler oluşturmayı sağlar: gölgeler (ışığın bakış açısından oluşturma), yansımalar, bulanıklık, parlama (bloom) ve HDR tonlama. Her efekt, ekran dışı bir dokuya ayrı bir geçiş gerektirir.
Evet, her ekran dışı geçiş GPU iş miktarını ikiye katlar çünkü sahne yeniden oluşturulur. Optimizasyon, ekran dışı doku çözünürlüğünü azaltmayı, renderbuffer kullanmayı ve MRT (Multiple Render Targets) ile geçişleri birleştirmeyi içerir.
FBO (Framebuffer Object), dokuların veya renderbuffer'ların eklendiği bir kapsayıcıdır. Texture, oluşturma sonuçlarının okunmasına izin verir (gölge haritalama, son efektler için gerekli). Renderbuffer daha hızlıdır ancak içeriği doku olarak kullanılamaz.
Tüm modern grafik API'leri: OpenGL ES (FBO aracılığıyla), Apple Metal (MTLRenderPassDescriptor aracılığıyla), Vulkan (VkFramebuffer aracılığıyla), Direct3D (Render Target View aracılığıyla). Kavramsal olarak mekanizma aynıdır — ekran yerine dokuya oluşturma.
Ö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.
Ayrıca okuyun