Offscreen Rendering: bu nədir, texnikalar və tətbiqlərdə istifadəsi

Müəllif: IT Sectr Dərc olunub: 2026-06-11 Oxuma vaxtı: 10 dəq

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 — səhnənin birbaşa ekrana deyil, teksturaya render edilməsi.
  • Framebuffer Object (FBO) — OpenGL ES-də ekrandankənar renderin əsas mexanizmi.
  • Multi-pass rendering — yekun təsvirin offscreen buferlər vasitəsilə bir neçə keçidə bölünməsi.
  • Kölgələr və əkslər — mobil qrafikada offscreen rendering-in tipik tətbiqləri.
  • Performans — ekrandankənar render əlavə GPU keçidləri səbəbindən optimallaşdırma tələb edir.

Offscreen Rendering nədir?

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.

Framebuffer Object (FBO)

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 necə işləyir?

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.

Offscreen rendering-in tipik dövrü

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.

cpp
// 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);

Ekrandankənar render texnikaları

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.

TexnikaKeçid sayıTəyinat
Shadow Mapping2+İşıq mənbəyindən kölgə xəritəsinin yaradılması
Reflection Mapping1-2Əkslərin kub xəritəyə render edilməsi
Bloom Effect3-5Təsvirin parlaq sahələrinin işıldaması
HDR Rendering2HDR təsvirləri üçün ton-mapping
Depth Prepass1Depth buferinin ilkin doldurulması

Render-to-Texture (RTT)

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.

Çoxkeçidli render (Multi-pass)

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.

Kölgə xəritələri (Shadow Mapping)

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.

Kölgə yaratma prosesi

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.

glsl
// 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 performansı

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.

Performans amilləri

  • Keçid sayı — hər əlavə keçid bütün səhnəni render edir, emal olunan təpə və fraqmentlərin sayını ikiqat artırır.
  • Offscreen teksturasının təsvir ölçüsü — çox yüksək təsvir ölçüsü seçimi yaddaş bant genişliyinə yükü artırır.
  • FBO dəyişikliyi — framebuffer obyektinin tez-tez dəyişməsi boru kəmərinin dayanmasına və GPU-dan istifadənin azalmasına səbəb olur.

Offscreen rendering optimallaşdırılması

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 kod nümunələri

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.

OpenGL ES 3.0 nümunəsi: teksturaya render

cpp
// 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 nümunəsi (iOS)

cpp
// 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 sadə sözlərlə nədir?

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 nə üçün lazımdır?

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.

Offscreen Rendering performansı yavaşlatırmı?

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 və Renderbuffer arasındakı fərq nədir?

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.

Hansı API-lər Offscreen Rendering-i dəstəkləyir?

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ə

  • Offscreen Rendering — qrafik səhnənin birbaşa ekrana deyil, teksturaya render edilməsi.
  • Framebuffer Object (FBO) — OpenGL ES-də ekrandankənar renderin əsas mexanizmi.
  • Shadow mapping və əkslər — offscreen rendering-in klassik tətbiq nümunələri.
  • Multi-pass rendering ardıcıl keçidlər vasitəsilə mürəkkəb effektləri həyata keçirməyə imkan verir.
  • Hər keçid GPU hesablama yükünü ikiqat artırır və diqqətlə optimallaşdırma tələb edir.
  • Renderbuffer teksturadan üstündür, əgər nəticə tekstur kimi oxunmalı deyilsə.
  • MRT (Multiple Render Targets) bir neçə keçidi bir keçiddə birləşdirməyə imkan verir.

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.

Layihəni müzakirə et

Həm də oxuyun