O que é renderização adiada?

54

Eu ouvi falar sobre renderização adiada e como usá-la pode permitir "muitas" luzes em uma cena sem um grande impacto no desempenho, mas o que é e (de alto nível) como é implementada?

Tetrad
fonte

Respostas:

55

A característica definidora da renderização adiada é que ela altera essencialmente a complexidade da renderização da cena de O (geometria * luzes) para O (geometria + luzes).

Isso é obtido renderizando a cena primeiro usando shaders projetados para gerar atributos básicos como (no mínimo) posição *, cor normal e difusa. Outros atributos podem incluir valores especulares por pixel e outras propriedades do material. Eles são armazenados em destinos de renderização em tela cheia, conhecidos coletivamente como buffer G.

(*: Vale a pena notar que os desenvolvedores optam por armazenar a profundidade com mais frequência e usá-la para reconstruir a posição, já que ter a profundidade disponível é útil para muitos outros efeitos. )

Após a geração do buffer G, é possível calcular um resultado totalmente iluminado para qualquer pixel na tela, resolvendo o BRDF exatamente uma vez por pixel por luz. Em outras palavras, se você tiver 20 malhas que são afetadas por 20 luzes, a renderização tradicional ("forward") exigiria que você renderize novamente cada malha várias vezes para acumular o resultado de cada luz que a afetar. Na pior das hipóteses, seria uma chamada de empate por malha por luz ou 400 chamadas no total! Para cada uma dessas chamadas de desenho, você está retransformando redundantemente os vértices da malha. Há também uma boa chance de você estar sombreando pixels que não são realmente afetados pela luz ou não serão visíveis no resultado final (porque eles serão obstruídos por outras geometrias na cena). Cada um desses resultados desperdiça recursos da GPU.

Compare com a renderização adiada: você só precisa renderizar as malhas uma vez para preencher o G-buffer. Depois disso, para cada luz, você cria uma forma delimitadora que representa a extensão da influência da luz. Para uma luz pontual, isso poderia ser uma esfera pequena ou, para uma luz direcional, seria um quad de tela cheia, pois a cena inteira é afetada.

Então, ao executar o sombreador de pixel / fragmento para o volume delimitador dessa luz, você lê os atributos de geometria da posição apropriada nas texturas do buffer G e usa esses valores para determinar o resultado da iluminação. Apenas os pixels da cena visíveis no resultado final são sombreados e sombreados exatamente uma vez por luz. Isso representa uma economia potencialmente enorme.

No entanto, não é sem inconvenientes. É um paradigma que é muito difícil de estender para lidar com geometria transparente (veja: peeling de profundidade). Tão difícil, de fato, que praticamente todas as implementações de renderização diferida recaem para a renderização direta das partes transparentes da cena. A renderização adiada também consome uma grande quantidade de VRAM e largura de banda do buffer de quadros, o que leva os desenvolvedores a fazer grandes esforços para compactar e compactar inteligentemente os atributos do buffer G nos menores / menores componentes possíveis.

Neverender
fonte
8

Também conhecido como sombreamento adiado, a renderização adiada refere-se a um amplo conjunto de caminhos de renderização possíveis que armazenam resultados intermediários em texturas e, em seguida, concluem a equação de renderização posteriormente, amostrando os dados intermediários.

Os buffers de geometria são um exemplo inicial, em que a cena é renderizada em uma série de buffers que contêm, por exemplo, a posição, a textura normal e a base da geometria opaca. A iluminação não foi aplicada e a cor final não é conhecida. Nas passagens subsequentes, as luzes são renderizadas e os buffers de geometria são amostrados. Isso significa que um grande número de luzes pode ser renderizado com um custo fixo do número de luzes possivelmente visíveis em um pixel da tela. A renderização tradicional teria avaliado todas as fontes de luz para superfícies ocluídas e nunca vistas na tela.

Existem muitas variações, incluindo a renderização de informações leves primeiro, por exemplo.

Consulte para obter mais informações: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Vincent Scheib
fonte
-3

A renderização adiada é o processamento onde a geomtry está antes de fazer uma segunda passagem para sombrear tudo. É útil porque altera a coplexidade para O (pixels * fontes de luz), permitindo que você use cenas complexas com apenas um pequeno impacto no desempenho.

Implementá-lo é bastante simples. A primeira passagem requer renderizar, no mínimo, a distância, normal e cor. Você pode adicionar mais texturas para renderizar, como especular e posicionar, ao custo da memória.

Depois de renderizados, você renderiza algumas esferas, onde uma fonte de luz exclusiva está no centro de cada uma, junta a luz, recorta tudo na geometria da cena e, finalmente, aplica a queda.

hellol11
fonte
Eu não acho que isso acrescente algo novo às respostas. Parece apenas partes reformuladas da resposta de Neverender.
precisa saber é o seguinte
@HolyBlackCat Existem algumas diferenças importantes. Primeiro, existe a equação correta da complexidade e, segundo, é muito mais concisa, enquanto explica como realmente implementá-la.
precisa saber é o seguinte
there's the correct complexity equationVerdadeiro. Mas eu diria que esse é um detalhe menor. Você pode sugerir isso como uma edição para a outra resposta ou deixar um comentário sobre isso quando tiver reputação suficiente. Fazer uma nova resposta por causa disso é um pouco exagerado. it's much more concisePessoalmente, não acho que isso seja bom. Quanto mais detalhes úteis uma resposta tem, melhor ela é, não é?
HolyBlackCat
11
@HolyBlackCat Até certo ponto, sim. Pessoalmente, não gosto de passar por uma parede de texto apenas para ter uma pergunta simples respondida.
precisa saber é o seguinte