Offscreen Rendering (renderização fora da tela) é uma técnica de renderização de uma cena 3D não na tela, mas em um buffer de textura (FBO — Framebuffer Object), que pode então ser usado como textura. De acordo com Apple Metal Documentation, 2025, o offscreen rendering é usado para criar sombras, reflexos, pós-efeitos e pré-processamento de gráficos. Offscreen Rendering permite dividir uma cena complexa em passos (passes) sem perda de qualidade.
Pontos Principais
Offscreen Rendering é um método de renderização de conteúdo gráfico em um buffer intermediário na memória de vídeo, em vez do framebuffer principal que é exibido na tela. O resultado da renderização fora da tela é salvo em uma textura ou renderbuffer.
O principal objetivo do offscreen rendering é a renderização multipasso (multi-pass rendering). Uma cena complexa é dividida em vários passos: primeiro a cena é renderizada em uma textura (offscreen), então essa textura é usada como entrada para o próximo passo, e assim até obter a imagem final. Essa abordagem permite alcançar efeitos impossíveis em um único passo.
O mecanismo chave da renderização fora da tela no OpenGL ES é o Framebuffer Object (FBO). Um FBO é um contêiner ao qual imagens de textura ou objetos renderbuffer podem ser anexados. Após vincular o FBO, todos os comandos de renderização subsequentes são direcionados à textura anexada, não à tela.
Offscreen Rendering é implementado criando um objeto framebuffer separado, anexando uma textura ou renderbuffer a ele, alternando o contexto de renderização para este FBO e executando comandos de desenho. Após a conclusão do passo, o contexto retorna ao framebuffer principal.
O processo consiste em três etapas: criar o FBO e anexar uma textura — renderizar a cena na textura fora da tela — usar a textura resultante no próximo passo. GL_COLOR_ATTACHMENT0 determina em qual textura de cor a renderização será realizada.
// Criação de um FBO para renderização fora da tela (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 é usado para uma ampla gama de efeitos gráficos. Cada técnica requer um ou mais passos fora da tela e uma configuração específica do FBO.
| Técnica | Número de passos | Propósito |
|---|---|---|
| Shadow Mapping | 2+ | Geração de um mapa de sombras a partir da fonte de luz |
| Reflection Mapping | 1-2 | Renderização de reflexos em um cubemap |
| Bloom Effect | 3-5 | Brilho em áreas claras da imagem |
| HDR Rendering | 2 | Tone mapping para imagens HDR |
| Depth Prepass | 1 | Pré-preenchimento do depth buffer |
Uma técnica básica na qual o resultado da renderização é salvo em uma textura para uso posterior. Render-to-Texture é usado para criar minimapas, texturas de objetos dinâmicos e pré-visualização de materiais complexos.
Efeitos complexos (HDR, bloom, depth of field) exigem vários passos sequenciais. Cada passo renderiza a cena em uma textura fora da tela, aplica um filtro e passa o resultado para o próximo passo. Essa abordagem permite acumular efeitos sem perda de qualidade da imagem final.
Shadow Mapping é um exemplo clássico de uso de offscreen rendering. A sombra é criada em dois passos: primeiro a cena é renderizada a partir do ponto de vista da fonte de luz em uma textura de profundidade (offscreen), depois durante a renderização principal cada fragmento é comparado com este mapa de profundidade para determinar se está na sombra.
Primeiro passo: a câmera é posicionada na fonte de luz, a cena é renderizada em um buffer fora da tela, registrando apenas a profundidade na textura. Segundo passo: renderização principal com verificação de cada fragmento — se sua profundidade for maior que o valor no mapa de profundidade, o fragmento está sombreado.
// Fragment Shader para shadow mapping
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 adiciona passos extras à GPU, o que aumenta a carga computacional geral e o consumo de energia. No desenvolvimento móvel isto é especialmente crítico: cada troca de FBO requer um flush de pipeline e tempo adicional.
Para dispositivos móveis é recomendado: usar renderbuffer em vez de textura se não for necessário ler o resultado (passo apenas de profundidade); escolher a resolução mínima necessária para as texturas fora da tela; combinar passos quando possível usando MRT (Multiple Render Targets).
Offscreen Rendering em diferentes plataformas é implementado através de suas próprias APIs. Vejamos exemplos para OpenGL ES e Apple Metal.
// Configuração de FBO e renderização de cena para textura
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);
// Voltando ao framebuffer padrão
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal: passo de renderização fora da tela para textura
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];
Perguntas Frequentes
Offscreen Rendering é quando os gráficos são desenhados não na tela, mas em um buffer invisível (textura). Este buffer é então usado como textura para outros efeitos. Imagine que você está desenhando em uma folha transparente que você então sobrepõe na imagem final.
A renderização fora da tela permite criar efeitos impossíveis em um único passo: sombras (renderização a partir do ponto de vista da luz), reflexos, desfoque, brilho (bloom) e tonificação HDR. Cada efeito requer um passo separado em uma textura fora da tela.
Sim, cada passo fora da tela dobra a quantidade de trabalho da GPU, pois a cena é renderizada novamente. A otimização inclui reduzir a resolução das texturas fora da tela, usar renderbuffers e combinar passos via MRT (Multiple Render Targets).
FBO (Framebuffer Object) é um contêiner ao qual texturas ou renderbuffers são anexados. Texture permite ler os resultados da renderização (necessário para shadow mapping, pós-efeitos). Renderbuffer é mais rápido, mas seu conteúdo não pode ser usado como textura.
Todas as APIs gráficas modernas: OpenGL ES (via FBO), Apple Metal (via MTLRenderPassDescriptor), Vulkan (via VkFramebuffer), Direct3D (via Render Target View). Conceitualmente o mecanismo é o mesmo — renderização em uma textura em vez da tela.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também