4 Pipeline gráfico
O pipeline gráfico ou pipeline de renderização é um modelo conceitual de descrição da sequência de passos que um sistema gráfico utiliza para transformar um modelo matemático de dados gráficos em uma imagem digital. O termo “pipeline” é utilizado porque o processamento é realizado em uma sequência linear de etapas alimentadas por um fluxo de dados, de modo que cada etapa pode processar novos dados tão logo tenha enviado a saída à etapa seguinte.
O pipeline é iniciado pela aplicação na CPU. A aplicação é responsável por alimentar o pipeline com os dados gráficos que serão renderizados. Em geral, esses dados descrevem objetos de uma cena 3D. A geometria de cada objeto é formada por malhas de triângulos, e uma câmera virtual define o ponto de vista da renderização.
O pipeline típico implementado nas atuais GPUs envolve etapas que compreendem o processamento geométrico, a rasterização e o processamento de fragmentos (figura 4.1):
Processamento geométrico: envolve operações realizadas sobre vértices, como transformações afins e transformações projetivas que serão abordadas em capítulos futuros. O processamento geométrico pode envolver também a criação de geometria e o refinamento de malhas. Ao final desse processamento é feito o recorte ou descarte das primitivas geométricas que estão fora da janela de visualização.
Rasterização: compreende a conversão matricial das primitivas. O resultado é um conjunto de amostras de primitivas. Durante o processamento no pipeline, o termo fragmento é frequentemente utilizado para designar essas amostras no lugar de pixel. Cada fragmento é uma coleção de valores que inclui atributos interpolados a partir dos vértices e a posição \((x,y,z)\) da amostra em coordenadas da janela (o valor \(z\) é considerado a “profundidade” do fragmento). O pixel é o valor final da cor no buffer de cor, que pode ser uma combinação da cor de vários fragmentos.
Processamento de fragmentos: envolve operações realizadas sobre cada fragmento para determinar sua cor e outros atributos. A cor pode ser determinada através da avaliação de modelos de iluminação que levam em conta os atributos de iluminação fornecidos pela aplicação, tais como fontes de luz, texturas e descrição de materiais de superfícies. Após essas operações são realizados testes de descarte de fragmentos e combinação de cores entre os fragmentos processados e os pixels já existentes no framebuffer. O resultado é armazenado em diferentes buffers do framebuffer: buffers de cor, buffer de profundidade e buffer de estêncil.