A renderização direta é o processo de calcular um valor de radiação para um fragmento de superfície diretamente da geometria de entrada e das informações de iluminação. A renderização adiada divide esse processo em duas etapas: primeiro produzindo um buffer de espaço na tela contendo propriedades do material (um buffer de geometria ou buffer G) criado por rasterização da geometria de entrada e, em seguida, produzindo um valor de radiação para cada pixel combinando o G- buffer com informações de iluminação.
A renderização diferida é frequentemente apresentada como uma otimização da renderização direta. Uma explicação é que a iluminação é bastante cara e, se houver excesso de pixels, você estará iluminando pixels que nunca serão vistos na tela, enquanto que, se você armazenar as propriedades do material em um buffer G e depois iluminar, estará iluminando apenas um pixel que realmente aparecem na tela. Isso é realmente uma vantagem do diferido, já que você também pode fazer um pré-passe de profundidade e, em seguida, um passe de renderização direta com o teste de profundidade definido como D3D11_COMPARISON_EQUAL
ou GL_EQUAL
equivalente?
A renderização adiada também tem o potencial de agendar melhor na GPU. Dividir uma grande frente de onda / deformação em uma frente de onda de geometria menor e frentes de onda de iluminação menores melhoram mais tarde a ocupação (mais frentes de onda em vôo simultaneamente). Mas você também acaba usando muito mais largura de banda (gravando um grande número de canais no buffer G e lendo-os novamente durante a iluminação). Obviamente, as especificidades aqui dependem muito da sua GPU, mas quais são os princípios gerais?
Existem outras considerações práticas de desempenho ao decidir entre renderização adiada e adiada? (Suponha que possamos usar variações de cada técnica, se necessário: ou seja, podemos comparar lado a lado com o lado diferido também.)