Buffers de imagem na GPU: tipos, natureza e características

Buffers de imagem na GPU

Você já se perguntou onde estão armazenadas as imagens que vê na tela do seu PC, console ou dispositivos PostPC? Bem, em buffers de imagem, mas qual é sua natureza e em que consiste? Como isso afeta o desempenho de nossos PCs, que formas de renderizar uma cena existem e quais são suas diferenças?

A GPU gera uma grande quantidade de informações por segundo, na forma de múltiplas imagens que passam rapidamente em nossa retina a partir da televisão, o tamanho dessas imagens e da informação que é armazenada e processada é enorme. Os buffers de imagem por serem armazenados em VRAM são um dos motivos pelos quais a memória de alta largura de banda é necessária.

Qual é o buffer de imagem?

Buffers de Imagen

O buffer de imagem é uma parte da VRAM onde são armazenadas as informações de cada pixel da tela do próximo quadro, esse buffer é armazenado na VRAM e é gerado pela GPU a cada x milissegundos.

As GPUs atuais trabalham com pelo menos dois buffers de imagem, no primeiro a GPU grava o próximo quadro que será visto na tela, no segundo está o quadro anterior já gerado, que é enviado para a tela.

Buffers de Imagen

Backbuffer ou buffer traseiro é denominado aquele gerado pela GPU e Frontbuffer ou buffer frontal é aquele que é lido pelo driver de vídeo e enviado para a saída de vídeo. Enquanto o buffer frontal armazena para cada pixel o valor dos componentes vermelho, verde e azul, no buffer traseiro ele pode armazenar um quarto componente, alfa, que armazena o valor de transparência ou semitransparência de um pixel.

Qual é o driver de vídeo?

O driver de vídeo é um hardware encontrado na GPU, é responsável por ler o buffer de imagem na VRAM e converter os dados em um sinal que a saída de vídeo, seja qual for o tipo, possa entender.

Em sistemas como NVIDIA G-SYNC, AMD FreeSync / Adaptive Sync e semelhantes, o controlador de exibição não apenas envia dados para o monitor ou televisão, mas também controla quando cada quadro começa e termina.

Buffers de imagem e renderização 3D tradicional

Embora nossas telas sejam 2D, por mais de vinte anos, cenas 3D foram renderizadas em tempo real nelas. Para fazer isso, é necessário dividir o buffer de fundo em dois buffers diferenciados:

  • Buffer de cor: Onde o valor da cor e dos componentes alfa de cada pixel é anotado.
  • Buffer de profundidade: Onde o valor de profundidade de cada pixel é apontado.

Ao renderizar uma cena 3D, podemos descobrir que vários pixels têm valores diferentes no buffer de profundidade, mas estão no mesmo lugar nas outras duas dimensões, é aqui que os pixels extras devem ser descartados, uma vez que não são visíveis pelo visualizador, o descarte é feito comparando a posição de cada pixel no buffer de profundidade, descartando com eles aqueles mais distantes da câmera.

O buffer de profundidade

Z-Buffer Búferes de imagen

O buffer de profundidade ou mais conhecido como Z-Buffer armazena a distância de cada pixel de uma cena 3D em relação ao ponto de vista ou câmera, esta pode ser gerada em um desses dois momentos.

  • Após a etapa de rasterização e antes da etapa de texturização.
  • Após a etapa de texturização.

Já que o estágio mais pesado computacionalmente é o do Pixel / Fragment Shader, o fato de gerar o Z-Buffer logo após a texturização da cena envolve o cálculo do valor da cor e, portanto, o Pixel ou Fragment Shader de centenas de milhares e até milhões de pixels não visíveis .

Transparências Ray Tracing

A contrapartida de fazer antes da texturização é que por não ter os valores de cor e transparência, canal alfa, podemos perceber que um pixel após o outro transparente é descartado de antemão, tornando-o invisível na cena final.

Para evitar isso, os desenvolvedores geralmente renderizam a cena em duas partes, a primeira não renderiza os objetos atrás de um objeto transparente ou semitransparente, enquanto a segunda renderiza apenas esses objetos.

Buffer de imagens e renderização lenta

Uma das novidades que foram vistas no final dos anos 2000 ao renderizar gráficos foi a renderização adiada ou renderização adiada, que consistia em primeiro renderizar a cena gerando uma série de buffers adicionais chamados G-Buffer e, em seguida, em uma próxima etapa calcular a iluminação do cena.

O fato de precisar de vários buffers de imagem multiplica as demandas de memória e, portanto, requer uma quantidade maior de memória para armazenamento, bem como uma taxa de preenchimento e, portanto, uma largura de banda maior.

múltiplas luzes

Mas, a renderização preguiçosa foi feita para corrigir um dos problemas de desempenho da rasterização clássica em que cada mudança no valor em um pixel, seja devido à luminância ou crominância, envolve uma reescrita no buffer da imagem, que se traduz em uma grande quantidade de dados a serem transmitidos na VRAM

Graças à renderização lenta, o custo do número de luzes na cena passa de exponencial para logarítmico, reduzindo assim o custo computacional ao renderizar cenas com várias fontes de luz.

Buffers de imagem como mapa de sombra

Mapas Sombras Z-Buffer

Como a rasterização não é muito boa para calcular a iluminação indireta, é necessário encontrar truques para gerar mapas de sombra nelas.

O método mais simples é renderizar a cena tomando a fonte de luz ou sombra como se fosse a câmera, mas em vez de renderizar uma imagem completa, apenas o buffer de profundidade é gerado, que será usado posteriormente como um mapa de sombras.

Este sistema irá desaparecer nos próximos anos devido ao surgimento do Ray Tracing, que permite a criação de sombras em tempo real de forma muito mais precisa, exigindo menos poder computacional e sem a necessidade de gerar um enorme mapa de sombras em VRAM.