Offscreen Rendering (ekrandankənar render) — 3D səhnənin ekrana deyil, tekstur buferinə (FBO — Framebuffer Object) render edilməsi texnikasıdır. Bu bufer daha sonra tekstur kimi istifadə oluna bilər. Apple Metal Documentation, 2025-in məlumatlarına görə, offscreen rendering kölgələrin, əkslərin, post-effektlərin yaradılması və qrafikanın ilkin emalı üçün tətbiq edilir. Offscreen Rendering mürəkkəb səhnəni keyfiyyət itkisi olmadan keçidlərə (passes) bölməyə imkan verir.
Əsas məqamlar
Offscreen Rendering — qrafik məzmunun əsas çərçivə buferinə (framebuffer) deyil, video yaddaşda aralıq buferə render edilməsi üsuludur. Ekrandankənar renderin nəticəsi tekstura və ya renderbuffer-də saxlanılır.
Offscreen rendering-in əsas məqsədi çoxkeçidli render (multi-pass rendering)-dir. Mürəkkəb səhnə bir neçə keçidə bölünür: əvvəlcə səhnə teksturaya (offscreen) render edilir, sonra bu tekstura növbəti keçid üçün giriş məlumatı kimi istifadə olunur və s. Bu yanaşma bir keçiddə mümkün olmayan effektləri həyata keçirməyə imkan verir.
OpenGL ES-də ekrandankənar renderin əsas mexanizmi Framebuffer Object (FBO)-dir. FBO — tekstur şəkillərinin və ya renderbuffer obyektlərinin birləşdirilə biləcəyi konteynerdir. FBO bağlandıqdan sonra bütün sonrakı render əmrləri ekrana deyil, bağlı teksturaya yönləndirilir.
Offscreen Rendering ayrıca framebuffer obyektinin yaradılması, ona tekstura və ya renderbuffer-in birləşdirilməsi, render kontekstinin bu FBO-ya keçirilməsi və çəkmə əmrlərinin icrası ilə həyata keçirilir. Keçid başa çatdıqdan sonra kontekst əsas framebuffer-a qaytarılır.
Proses üç addımdan ibarətdir: FBO yaratma və teksturanı birləşdirmə — səhnəni offscreen teksturaya render etmə — əldə edilmiş teksturanı növbəti keçiddə istifadə etmə. GL_COLOR_ATTACHMENT0 renderin hansı rəng teksturasına aparılacağını müyyən edir.
// Offscreen rendering üçün FBO yaradılması (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 geniş spektrli qrafik effektlər üçün istifadə olunur. Hər bir texnika bir və ya bir neçə ekrandankənar keçid və müəyyən FBO konfiqurasiyası tələb edir.
| Texnika | Keçid sayı | Təyinat |
|---|---|---|
| Shadow Mapping | 2+ | İşıq mənbəyindən kölgə xəritəsinin yaradılması |
| Reflection Mapping | 1-2 | Əkslərin kub xəritəyə render edilməsi |
| Bloom Effect | 3-5 | Təsvirin parlaq sahələrinin işıldaması |
| HDR Rendering | 2 | HDR təsvirləri üçün ton-mapping |
| Depth Prepass | 1 | Depth buferinin ilkin doldurulması |
Render nəticəsinin sonrakı istifadə üçün teksturada saxlanıldığı əsas texnika. Render-to-Texture mini xəritələrin, dinamik obyekt teksturalarının və mürəkkəb materialların ilkin vizuallaşdırılması üçün tətbiq edilir.
Mürəkkəb effektlər (HDR, bloom, depth of field) bir neçə ardıcıl keçid tələb edir. Hər keçid səhnəni offscreen teksturaya render edir, filtr tətbiq edir və nəticəni növbəti keçidə ötürür. Bu yanaşma yekun təsvirin keyfiyyətini itirmədən effektləri toplamağa imkan verir.
Shadow Mapping — offscreen rendering-in klassik nümunəsidir. Kölgə iki keçiddə yaradılır: əvvəlcə səhnə işıq mənbəyi baxımından depth teksturasına (offscreen) render edilir, sonra əsas render zamanı hər fraqment bu depth xəritəsi ilə müqayisə edilərək kölgədə olub-olmadığı müyyənləşdirilir.
Birinci keçid: kamera işıq mənbəyinin mövqeyinə qoyulur, səhnə offscreen buferə render edilir, yalnız dərinlik (depth) teksturaya yazılır. İkinci keçid: əsas render hər fraqmenti yoxlayır — əgər onun dərinliyi depth xəritəsindəki dəyərdən böyükdürsə, fraqment kölgələnir.
// Kölgə xəritəsi üçün 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 əlavə GPU keçidləri əlavə edir ki, bu da ümumi hesablama yükünü və enerji istehlakını artırır. Mobil inkişafda bu xüsusilə kritikdir: hər FBO dəyişikliyi boru kəmərinin sıfırlanmasını (pipeline flush) və əlavə vaxt tələb edir.
Mobil cihazlar üçün tövsiyə olunur: nəticənin oxunması tələb olunmursa, tekstura əvəzinə renderbuffer istifadə edin (yalnız dərinlik keçidi); offscreen teksturalarının minimal zəruri təsvir ölçüsünü seçin; mümkün olduqda keçidləri MRT (Multiple Render Targets) vasitəsilə birləşdirin.
Offscreen Rendering müxtəlif platformalarda öz API-ləri vasitəsilə həyata keçirilir. OpenGL ES və Apple Metal üçün nümunələri nəzərdən keçirək.
// FBO konfiqurasiyası və səhnənin teksturaya render edilməsi
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);
// Defolt framebuffer-a qayıdış
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: offscreen render keçidi teksturaya
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];
Tez-tez verilən suallar
Offscreen Rendering — qrafikanın ekrana deyil, görünməz buferə (teksturaya) çəkildiyi zamandır. Bu bufer daha sonra digər effektlər üçün tekstur kimi istifadə olunur. Təsəvvür edin ki, şəffaf plyonkada çəkirsiniz və onu son təsvirin üzərinə qoyursunuz.
Ekrandankənar render bir keçiddə mümkün olmayan effektləri yaratmağa imkan verir: kölgələr (işıq baxımından render), əkslər, bulanıqlıq, işıldama (bloom) və HDR tonlama. Hər effekt offscreen teksturasına ayrı keçid tələb edir.
Bəli, hər ekrandankənar keçid GPU-nun iş həcmini ikiqat artırır, çünki səhnə təkrardan render edilir. Optimallaşdırma offscreen teksturalarının təsvir ölçüsünün azaldılması, renderbuffer istifadəsi və keçidlərin MRT (Multiple Render Targets) vasitəsilə birləşdirilməsini əhatə edir.
FBO (Framebuffer Object) — teksturların və ya renderbuffer-lərin birləşdirildiyi konteynerdir. Texture render nəticələrini oxumağa imkan verir (kölgə mapping, post-effektlər üçün lazımdır). Renderbuffer daha sürətlidir, lakin onun məzmunu tekstur kimi istifadə edilə bilməz.
Bütün müasir qrafik API-lər: OpenGL ES (FBO vasitəsilə), Apple Metal (MTLRenderPassDescriptor vasitəsilə), Vulkan (VkFramebuffer vasitəsilə), Direct3D (Render Target View vasitəsilə). Konseptual olaraq mexanizm eynidir — ekran əvəzinə teksturaya render.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun