Offscreen Rendering (ванекранско рендеровање) — је техника рендеровања 3D сцене не на екран, већ у текстурни буфер (FBO — Framebuffer Object), који затим може да се користи као текстура. Према Apple Metal Documentation, 2025, offscreen rendering се користи за стварање сенки, одраза, пост-ефеката и претходне обраде графике. Offscreen Rendering омогућава поделу сложене сцене на пролазе (passes) без губитка квалитета.
Кључне тачке
Offscreen Rendering — је метода рендеровања графичког садржаја у посредни буфер у видео меморији, а не у главни буфер оквира (framebuffer) који се приказује на екрану. Резултат ванекранског рендеровања се чува у текстури или renderbuffer-у.
Главна сврха offscreen rendering је вишепролазно рендеровање (multi-pass rendering). Сложена сцена се подељује на више пролаза: прво се сцена рендерује у текстуру (offscreen), затим се та текстура користи као улазни подаци за следећи пролаз, и тако даље до добијања коначне слике. Овакав приступ омогућава реализацију ефеката који су немогући у једном пролазу.
Кључни механизам ванекранског рендеровања у OpenGL ES је Framebuffer Object (FBO). FBO је контејнер на који се могу прикачити слике текстура или renderbuffer објекти. Након повезивања FBO, сви наредни налози за рендеровање се усмеравају ка повезаној текстури, а не ка екрану.
Offscreen Rendering се реализује кроз стварање засебног фрејмбуфер објекта, прикачивање текстуре или renderbuffer-а на њега, пребацивање контекста рендеровања на овај FBO и извршавање наредби за цртање. Након завршетка пролаза, контекст се враћа на главни framebuffer.
Процес се састоји од три корака: стварање FBO и прикачивање текстуре — рендеровање сцене у offscreen текстуру — коришћење добијене текстуре у следећем пролазу. GL_COLOR_ATTACHMENT0 одређује у коју текстуру боје ће се вршити рендеровање.
// Креирање FBO за ванекранско рендеровање (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 се користи за широк спектар графичких ефеката. Свака техника захтева један или више ванекранских пролаза и одређену конфигурацију FBO.
| Техника | Број пролаза | Намена |
|---|---|---|
| Shadow Mapping | 2+ | Генерисање мапе сенки из извора светлости |
| Reflection Mapping | 1-2 | Рендеровање одраза у кубну мапу |
| Bloom Effect | 3-5 | Сјај светлих делова слике |
| HDR Rendering | 2 | Тон-мапинг за HDR слике |
| Depth Prepass | 1 | Претходно пуњење depth буфера |
Основна техника у којој се резултат рендеровања чува у текстури за касније коришћење. Render-to-Texture се користи за стварање мини-мапа, текстура динамичких објеката и претходне визуелизације сложених материјала.
Сложени ефекти (HDR, bloom, depth of field) захтевају више узастопних пролаза. Сваки пролаз рендерује сцену у offscreen текстуру, примењује филтер и преноси резултат следећем пролазу. Овакав приступ омогућава акумулацију ефеката без губитка квалитета коначне слике.
Shadow Mapping — класичан пример коришћења offscreen rendering. Сенка се ствара у два пролаза: прво се сцена рендерује из угла извора светлости у текстуру дубине (offscreen), затим се при главном рендеровању сваки фрагмент пореди са овом мапом дубине да би се утврдило да ли се налази у сенци.
Први пролаз: камера се поставља у позицију извора светлости, сцена се рендерује у offscreen буфер, записујући само дубину (depth) у текстуру. Други пролаз: главно рендеровање са провером сваког фрагмента — ако је његова дубина већа од вредности у мапи дубине, фрагмент се засеньује.
// 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 додаје додатне GPU пролазе, што повећава укупно рачунарско оптерећење и потрошњу енергије. У мобилном развоју ово је посебно критично: свако пребацивање FBO захтева ресетовање пипејна (pipeline flush) и додатно време.
За мобилне уређаје се препоручује: коришћење renderbuffer уместо текстуре ако није потребно читање резултата (depth-only pass); избор минимално потребне резолуције offscreen текстура; обједињавање пролаза где је могуће кроз MRT (Multiple Render Targets).
Offscreen Rendering на различитим платформама се реализује кроз сопствене API-је. Размотримо примере за OpenGL ES и Apple Metal.
// Подешавање FBO и рендеровање сцене у текстуру
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);
// Враћање на подразумевани framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: offscreen пролаз рендеровања у текстуру
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];
Често постављана питања
Offscreen Rendering је када се графика црта не на екран, већ у невидљиви буфер (текстуру). Овај буфер се затим користи као текстура за друге ефекте. Замислите да цртате на прозирној фолији коју затим преклапате преко коначне слике.
Ванекранско рендеровање омогућава стварање ефеката који су немогући у једном пролазу: сенке (рендеровање из угла светлости), одрази, замућење, сјај (bloom) и HDR тонирање. Сваки ефекат захтева посебан пролаз у offscreen текстуру.
Да, сваки ванекрански пролаз дуплира количину посла GPU, јер се сцена поново рендерује. Оптимизација укључује смањење резолуције offscreen текстура, коришћење renderbuffer и обједињавање пролаза кроз MRT (Multiple Render Targets).
FBO (Framebuffer Object) је контејнер на који се прикачују текстуре или renderbuffer. Texture омогућава читање резултата рендеровања (потребно за мапирање сенки, пост-ефекте). Renderbuffer је бржи, али његов садржај не може да се користи као текстура.
Сви савремени графички API: OpenGL ES (кроз FBO), Apple Metal (кроз MTLRenderPassDescriptor), Vulkan (кроз VkFramebuffer), Direct3D (кроз Render Target View). Концептуално механизам је исти — рендеровање у текстуру уместо на екран.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође