Perco / ganho desempenho ao descartar pixels, mesmo que eu não use o teste de profundidade?

22

Quando procurei pela primeira vez instruções sobre descarte, encontrei especialistas dizendo que o uso do descarte resultará em perda de desempenho. Eles disseram que o descarte de pixels interromperá a capacidade da GPU de usar o zBuffer corretamente, porque a GPU precisa executar primeiro o Fragment shader para os dois objetos para verificar se o mais próximo da câmera é descartado ou não. Para um jogo 2D em que estou trabalhando, desativei o teste de profundidade e a gravação de profundidade. Estou desenhando todos os objetos classificados por profundidade e isso é tudo, não é necessário que a GPU faça coisas sofisticadas. agora estou me perguntando, ainda é ruim se eu descartar pixels no meu shader de fragmentos?

Ali1S232
fonte

Respostas:

20

O hardware gráfico pode executar a seleção antecipada de fragmentos com base na profundidade antes de calcular o valor da cor (em outras palavras, antes de executar o shader de fragmento). Conseqüentemente, se você utilizar quaisquer recursos que afetariam isso, como o discardteste alfa ou a manipulação gl_FragDepthda capacidade do hardware para fazer essa otimização, ela será comprometida, pois a profundidade real do fragmento não pode ser assumida e o sombreador completo deve ser executado.

Se o uso de algum desses recursos comprometedores tem ou não um impacto líquido no desempenho, depende da situação. A otimização do início-z pode melhorar o desempenho se você tiver shaders de fragmento muito caros, por exemplo, mas se o custo do seu pipeline estiver no shader de vértice (ou em outro local), não será muito útil e, consequentemente, você poderá ver pouco ou nenhuma degradação de desempenho usando discard.

Desabilitar o teste de profundidade inteiramente por meio da API também deve impedir a otimização, pois pode resultar em cenas renderizadas incorretamente. No seu caso, então, não deve importar que você use discard.

O hardware recente pode forçar os testes (incluindo os primeiros testes de estêncil) usando layout(early_fragment_tests)- há mais informações (e advertências) sobre isso na página que eu vinculei no início da resposta.

Josh
fonte
3

Como sempre, para perguntas sobre desempenho, a resposta mais precisa é experimentá-lo no hardware de destino e medir o que acontece.

No seu caso, provavelmente não é uma coisa ruim a se fazer. De fato, há uma chance de ajudar no desempenho economizando largura de banda de memória. Porém, ele também adiciona instruções de sombreador, portanto nem sempre é um benefício de desempenho.

Mesmo ao usar o buffer de profundidade, o impacto no desempenho nem sempre é muito significativo, se você for cuidadoso com a ordem em que desenha as coisas.

Há uma postagem no blog em https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ que descreve em alguns detalhes como os testes de profundidade iniciais podem funcionar no hardware e que limitações podem existir.

Adão
fonte
1
Na verdade, após o teste, acho seguro presumir que não perco nem ganho desempenho, mas estava procurando uma resposta que desse uma explicação detalhada do que e por que isso acontecerá.
Ali1S232