Offscreen Rendering (ekrandan tashqari renderlash) — bu 3D sahna tasvirini ekranga emas, tekstura buferiga (FBO — Framebuffer Object) renderlash texnikasi bo'lib, keyinchalik tekstura sifatida ishlatilishi mumkin. Apple Metal Documentation, 2025 ma'lumotlariga köra, offscreen rendering soyalar, akslar, post-effektlar yaratish va grafikani oldindan qayta ishlash uchun qo'llaniladi. Offscreen Rendering murakkab sahnani sifat yo'qotmasdan o'tishlarga (passes) bo'lish imkonini beradi.
Asosiy fikrlar
Offscreen Rendering — grafik tarkibni asosiy kadr buferiga (framebuffer) emas, video xotirada oraliq buferga renderlash usulidir. Ekrandan tashqari renderlash natijasi tekstura yoki renderbuffer da saqlanadi.
Offscreen renderingning asosiy maqsadi ko'p o'tishli renderlash (multi-pass rendering) dir. Murakkab sahna bir necha o'tishga bo'linadi: avval sahna teksturaga (offscreen) renderlanadi, keyin bu tekstura keyingi o'tish uchun kirish ma'lumoti sifatida ishlatiladi va hokazo. Bunday yondashuv bir o'tishda mumkin bo'lmagan effektlarni amalga oshirish imkonini beradi.
OpenGL ES da ekrandan tashqari renderlashning asosiy mexanizmi Framebuffer Object (FBO) dir. FBO — tekstura tasvirlari yoki renderbuffer obyektlari biriktirilishi mumkin bo'lgan konteyner. FBO ulangandan so'ng, barcha keyingi renderlash buyruqlari ekranga emas, biriktirilgan teksturaga yo'naltiriladi.
Offscreen Rendering alohida framebuffer obyektini yaratish, unga tekstura yoki renderbuffer biriktirish, renderlash kontekstini ushbu FBO ga o'tkazish va chizish buyruqlarini bajarish orqali amalga oshiriladi. O'tish tugagach, kontekst asosiy framebuffer ga qaytariladi.
Jarayon uch bosqichdan iborat: FBO yaratish va teksturani biriktirish — sahnani offscreen teksturasiga renderlash — olingan teksturani keyingi o'tishda ishlatish. GL_COLOR_ATTACHMENT0 renderlash qaysi rang teksturasiga amalga oshirilishini belgilaydi.
// Offscreen rendering uchun FBO yaratish (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 keng spektrli grafik effektlar uchun ishlatiladi. Har bir texnika bir yoki bir necha ekrandan tashqari o'tish va ma'lum FBO konfiguratsiyasini talab qiladi.
| Texnika | O'tish soni | Maqsad |
|---|---|---|
| Shadow Mapping | 2+ | Yorug'lik manbasidan soya xaritasini yaratish |
| Reflection Mapping | 1-2 | Akslarni kub xaritaga renderlash |
| Bloom Effect | 3-5 | Tasvirning yorqin qismlarining porlashi |
| HDR Rendering | 2 | HDR tasvirlar uchun ton-mapping |
| Depth Prepass | 1 | Depth buferini oldindan to'ldirish |
Renderlash natijasi keyingi foydalanish uchun teksturada saqlanadigan asosiy texnika. Render-to-Texture mini-xaritalar, dinamik obyekt teksturalari va murakkab materiallarni oldindan ko'rish uchun qo'llaniladi.
Murakkab effektlar (HDR, bloom, depth of field) bir necha ketma-ket o'tishni talab qiladi. Har bir o'tish sahnani offscreen teksturasiga renderlaydi, filtr qo'llaydi va natijani keyingi o'tishga uzatadi. Bunday yondashuv yakuniy tasvir sifatini yo'qotmasdan effektlarni to'plash imkonini beradi.
Shadow Mapping — offscreen renderingdan foydalanishning klassik namunasidir. Soya ikki o'tishda yaratiladi: avval sahna yorug'lik manbai nuqtai nazaridan depth teksturasiga (offscreen) renderlanadi, so'ngra asosiy renderlashda har bir fragment bu depth xaritasi bilan solishtirilib, soya ichida ekanligi aniqlanadi.
Birinchi o'tish: kamera yorug'lik manbai holatiga qo'yiladi, sahna offscreen buferga renderlanadi va faqat chuqurlik (depth) teksturaga yoziladi. Ikkinchi o'tish: asosiy renderlash har bir fragmentni tekshiradi — agar uning chuqurligi depth xaritasidagi qiymatdan katta bo'lsa, fragment soyalanadi.
// Soya xaritasi uchun 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 qo'shimcha GPU o'tishlarini qo'shadi, bu esa umumiy hisoblash yukini va energiya sarfini oshiradi. Mobil ishlab chiqishda bu ayniqsa muhim: har bir FBO o'zgarishi quvur liniyasini tozalashni (pipeline flush) va qo'shimcha vaqtni talab qiladi.
Mobil qurilmalar uchun tavsiya etiladi: agar natijani o'qish talab qilinmasa, tekstura o'rniga renderbuffer ishlating (faqat depth o'tishi); offscreen teksturalarining minimal zarur o'lchamini tanlang; iloji bo'lganda o'tishlarni MRT (Multiple Render Targets) orqali birlashtiring.
Offscreen Rendering turli platformalarda o'z API lari orqali amalga oshiriladi. OpenGL ES va Apple Metal uchun namunalarni ko'rib chiqamiz.
// FBO sozlash va sahnani teksturaga renderlash
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);
// Standart framebuffer ga qaytish
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: offscreen render o'tishi teksturaga
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];
Ko'p beriladigan savollar
Offscreen Rendering — bu grafika ekranga emas, ko'rinmas buferga (teksturaga) chizilgandir. Bu bufer keyinchalik boshqa effektlar uchun tekstura sifatida ishlatiladi. Tasavvur qiling, shaffof plyonkaga chizasiz va keyin uni yakuniy tasvir ustiga qo'yasiz.
Ekrandan tashqari renderlash bir o'tishda mumkin bo'lmagan effektlarni yaratish imkonini beradi: soyalar (yorug'lik nuqtai nazaridan renderlash), akslar, xiralashtirish, porlash (bloom) va HDR tonlash. Har bir effekt offscreen teksturasiga alohida o'tishni talab qiladi.
Ha, har bir ekrandan tashqari o'tish GPU ish hajmini ikki baravar oshiradi, chunki sahna qayta renderlanadi. Optimallashtirish offscreen teksturalari o'lchamini kamaytirish, renderbuffer ishlatish va o'tishlarni MRT (Multiple Render Targets) orqali birlashtirishni o'z ichiga oladi.
FBO (Framebuffer Object) — teksturalar yoki renderbuffer biriktiriladigan konteyner. Texture renderlash natijalarini o'qish imkonini beradi (soya xaritasi, post-effektlar uchun kerak). Renderbuffer tezroq, lekin uning mazmuni tekstura sifatida ishlatilmaydi.
Barcha zamonaviy grafik API lar: OpenGL ES (FBO orqali), Apple Metal (MTLRenderPassDescriptor orqali), Vulkan (VkFramebuffer orqali), Direct3D (Render Target View orqali). Kontseptual jihatdan mexanizm bir xil — ekran o'rniga teksturaga renderlash.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.