Renderização lado a lado - Tiled rendering
A renderização ladrilhada é o processo de subdividir uma imagem de computação gráfica por uma grade regular no espaço óptico e renderizar cada seção da grade, ou ladrilho , separadamente. A vantagem desse design é que a quantidade de memória e largura de banda é reduzida em comparação com os sistemas de renderização de modo imediato que desenham o quadro inteiro de uma vez. Isso tornou os sistemas de renderização de blocos particularmente comuns para o uso de dispositivos portáteis de baixa potência . A renderização lado a lado às vezes é conhecida como uma arquitetura de "classificação intermediária", porque realiza a classificação da geometria no meio do pipeline de gráficos, em vez de perto do final.
Conceito básico
A criação de uma imagem 3D para exibição consiste em uma série de etapas. Primeiro, os objetos a serem exibidos são carregados na memória a partir de modelos individuais . O sistema então aplica funções matemáticas para transformar os modelos em um sistema de coordenadas comum, a visão de mundo . A partir dessa visão de mundo, uma série de polígonos (normalmente triângulos) é criada que se aproxima dos modelos originais vistos de um ponto de vista específico, a câmera . Em seguida, um sistema de composição produz uma imagem renderizando os triângulos e aplicando texturas na parte externa. Texturas são pequenas imagens pintadas nos triângulos para produzir realismo. A imagem resultante é então combinada com vários efeitos especiais e movida para um buffer de quadros , que o hardware de vídeo faz a varredura para produzir a imagem exibida. Esse layout conceitual básico é conhecido como pipeline de exibição .
Cada uma dessas etapas aumenta a quantidade de memória necessária para armazenar a imagem resultante. No momento em que chega ao final do pipeline, as imagens são tão grandes que os designs típicos de placas gráficas costumam usar memória especializada de alta velocidade e um barramento de computador muito rápido para fornecer a largura de banda necessária para mover a imagem para dentro e para fora dos vários sub componentes do pipeline. Esse tipo de suporte é possível em placas de vídeo dedicadas, mas conforme os orçamentos de energia e tamanho se tornam mais limitados, fornecer largura de banda suficiente torna-se caro em termos de design.
Os renderizadores de blocos tratam dessa preocupação dividindo a imagem em seções conhecidas como blocos e renderizando cada uma separadamente. Isso reduz a quantidade de memória necessária durante as etapas intermediárias e a quantidade de dados que estão sendo movidos a qualquer momento. Para fazer isso, o sistema classifica os triângulos que compõem a geometria por localização, permitindo encontrar rapidamente quais triângulos se sobrepõem aos limites dos ladrilhos. Em seguida, carrega apenas esses triângulos no pipeline de renderização, realiza as várias operações de renderização na GPU e envia o resultado para o buffer de quadros . Ladrilhos muito pequenos podem ser usados, 16 × 16 e 32 × 32 pixels são tamanhos de ladrilhos populares, o que torna pequena a quantidade de memória e largura de banda necessária nos estágios internos. E como cada bloco é independente, ele naturalmente se presta a uma paralelização simples.
Em um renderizador de ladrilhos típico, a geometria deve primeiro ser transformada em espaço de tela e atribuída a ladrilhos de espaço de tela. Isso requer algum armazenamento para as listas de geometria de cada ladrilho. Nos primeiros sistemas em mosaico, isso era executado pela CPU , mas todo hardware moderno contém hardware para acelerar esta etapa. A lista de geometria também pode ser classificada da frente para trás, permitindo que a GPU use a remoção de superfície oculta para evitar o processamento de pixels que estão ocultos atrás de outros, economizando largura de banda de memória para pesquisas de textura desnecessárias.
Existem duas desvantagens principais na abordagem lado a lado. Uma é que alguns triângulos podem ser desenhados várias vezes se eles se sobrepuserem a várias peças. Isso significa que o tempo total de renderização seria maior do que em um sistema de renderização de modo imediato. Também existem possíveis problemas quando os ladrilhos precisam ser costurados para formar uma imagem completa, mas esse problema foi resolvido há muito tempo. Mais difícil de resolver é que algumas técnicas de imagem são aplicadas ao quadro como um todo, e são difíceis de implementar em uma renderização lado a lado, onde a ideia é não ter que trabalhar com o quadro inteiro. Essas compensações são bem conhecidas e de menor importância para sistemas em que as vantagens são úteis; sistemas de renderização lado a lado são amplamente encontrados em dispositivos de computação portáteis.
A renderização em mosaico não deve ser confundida com esquemas de endereçamento de buffer de quadro em mosaico / não linear , que tornam os pixels adjacentes também adjacentes na memória. Esses esquemas de endereçamento são usados por uma ampla variedade de arquiteturas, não apenas por renderizadores lado a lado.
Trabalho cedo
Muito do trabalho inicial de renderização em mosaico foi feito como parte da arquitetura Pixel Planes 5 (1989).
O projeto Pixel Planes 5 validou a abordagem lado a lado e inventou muitas das técnicas agora vistas como padrão para renderizadores lado a lado. É o trabalho mais citado por outros jornais da área.
A abordagem lado a lado também era conhecida no início da história da renderização de software. As implementações de renderização de Reyes geralmente dividem a imagem em "baldes de ladrilhos".
Produtos comerciais - Desktop e console
No início do desenvolvimento de GPUs de desktop, várias empresas desenvolveram arquiteturas lado a lado. Com o tempo, eles foram amplamente suplantados por GPUs de modo imediato com sistemas de memória externa personalizados rápidos.
Os principais exemplos disso são:
- Arquitetura de renderização PowerVR (1996): O rasterizador consistia em um bloco de 32 × 32 no qual os polígonos eram rasterizados na imagem em vários pixels em paralelo. Nas primeiras versões de PC , o tiling era executado no driver de vídeo em execução na CPU . Na aplicação do console Dreamcast , a colocação lado a lado foi realizada por uma peça de hardware. Essa renderização adiada facilitada - apenas os pixels visíveis foram mapeados por textura , economizando cálculos de sombreamento e textura- largura de banda .
- Microsoft Talisman (1996)
- Dreamcast (alimentado por chipset PowerVR) (1998)
- Gigapixel GP-1 (1999)
- GPU Intel Larrabee (2009) (cancelado)
- PS Vita (com chipset PowerVR) (2011)
- GPUs Nvidia baseadas na arquitetura Maxwell e arquiteturas posteriores (2014)
- GPUs AMD baseadas na arquitetura Vega (GCN5) e arquiteturas posteriores (2017)
- GPU Intel Gen11 e arquiteturas posteriores (2019)
Exemplos de arquiteturas não lado a lado que usam grandes buffers no chip são:
- Xbox 360 (2005): a GPU contém uma eDRAM de 10 MB embutida ; isso não é suficiente para manter o raster de uma imagem 1280 × 720 inteira com anti-aliasing multisample 4 × , portanto, uma solução de tiling é sobreposta ao executar em resoluções HD e 4 × MSAA é habilitado.
- Xbox One (2013): a GPU contém uma eSRAM de 32 MB embutida , que pode ser usada para conter toda ou parte de uma imagem. Não é uma arquitetura lado a lado, mas é flexível o suficiente para que os desenvolvedores de software possam emular a renderização lado a lado.
Produtos comerciais - incorporados
Devido à largura de banda da memória externa relativamente baixa e à quantidade modesta de memória no chip necessária, a renderização lado a lado é uma tecnologia popular para GPUs incorporadas. Os exemplos atuais incluem:
Renderização em modo imediato baseado em bloco (TBIM):
- ARM Mali series.
- Qualcomm Adreno (série 300 e mais recente também pode alternar dinamicamente para renderização no modo imediato / direto via FlexRender).
Renderização diferida baseada em blocos (TBDR):
- Arm Mali series.
- Imagination Technologies PowerVR série 5/6/7.
- Série Broadcom VideoCore IV .
- GPUs de silício da Apple .
A Vivante produz GPUs móveis que possuem memória buffer de quadro fortemente acoplada (semelhante à GPU Xbox 360 descrita acima). Embora isso possa ser usado para renderizar partes da tela, o grande tamanho das regiões renderizadas significa que elas geralmente não são descritas como usando uma arquitetura baseada em blocos.