Orçamento de modelos 3D. O que importa mais número de triângulos ou vértices

12

Quando estou criando um modelo para um jogo em 3D, o que devo tomar como medida no meu orçamento Polígonos (triângulos) ou vértices? Fiz um experimento com dois conjuntos de 40000 cubos, um com 8 vértices e 12 triângulos, outro com 24 vértices e 12 triângulos. Tudo foi feito no Unity e os dois foram gerados proceduralmente. Para minha surpresa, os dois sets tiveram quase o mesmo desempenho, houve uma diferença muito pequena entre eles.

Isso significa que não devo me preocupar com a contagem de vértices e apenas olhar para a contagem de triângulos?

Edição: Fiz outra experiência. Criei um plano com triângulos 19602 e 10000 vértices e outro com a mesma quantidade de retângulos, mas com 39204 vértices. Eu gerei 4000 de ambos. Agora menos vértices ganhavam 14 fps a 19 fps. Então, acho que geralmente menos é melhor, mas apenas em grandes diferenças.

Michał Leszczyński
fonte
9
Escreva seu jogo e corrija os problemas à medida que eles surgirem. Este tipo de problema pode nunca vir para cima e você está desperdiçando seu tempo: P
Vaillancourt

Respostas:

16

Vamos imaginar uma grande malha de grade, como uma que podemos usar para terrenos. Vamos render ntriângulos, cobrindo, digamos, metade da nossa tela de 1080p, em uma única chamada.

Se soldarmos todos os nossos vértices e não tivermos costuras de suavização / texturização, cada triângulo terá 3 vértices e cada vértice será compartilhado por 6 triângulos, portanto, teremos n/2vértices.

Para renderizar isso, precisamos:

  • Execute o vertex shader pelo menos n/2vezes

    ("pelo menos" porque nosso cache para resultados de vértices é muito grande. Às vezes, acabamos despejando um vértice que já transformamos, depois precisamos dele novamente para um triângulo posterior que o compartilhe e execute novamente o sombreador de vértice nele Portanto, não temos tanta economia quanto parece no papel)

  • nTriângulos de clipe e abate .

  • Rasterize e interpole em pelo menos 1920x1080 / 2 ou cerca de 1 milhão de pixels do buffer de quadros (já que dissemos que nosso terreno cobre cerca da metade da tela).

    ("pelo menos" por causa da maneira como as GPUs funcionam em quadríceps de pixels , alguns fragmentos fora das bordas dos polígonos ainda são rasterizados, mas depois mascarados, o que significa que processamos fragmentos duas vezes. se oculta, se não tivermos a sorte de desenhar o polígono mais à frente no buffer de profundidade primeiro)

  • Execute o sombreador de fragmentos para todos aqueles> = 1 milhão de fragmentos.

  • Misture ~ 1 milhão de resultados nos buffers de quadro e profundidade.

Ok, agora vamos desfazer todos os nossos vértices, agora temos 3nvértices para renderizar, seis vezes mais do que antes! Nossos passos são ...

  • Execute os 3ntempos do vertex shader .

    (Nenhum asterisco devido ao armazenamento em cache, pois todos os vértices são usados ​​apenas uma vez, embora isso signifique que o cache não pode nos salvar a qualquer momento)

  • nTriângulos de clipe e abate .

  • Rasterize e interpole em pelo menos 1920x1080 / 2 ou cerca de 1 milhão de pixels do buffer de quadros.

  • Execute o sombreador de fragmentos para todos aqueles> = 1 milhão de fragmentos.

  • Misture ~ 1 milhão de resultados nos buffers de quadro e profundidade.

... espere, cada passo, exceto o primeiro, é o mesmo! Portanto, a maior parte do trabalho que a GPU realiza em uma chamada de empate típica não está diretamente relacionada ao número de vértices usados. A quantidade de cobertura da tela, excesso e contagem total de triângulos compõem muito mais o custo.

Isso não significa que os vértices são totalmente gratuitos. Se você compartilha vértices quando pode obter algumas economias modestas do armazenamento em cache, especialmente se seus shaders de vértice são complicados ou o pipeline de vértices do seu hardware é fraco (como foi o caso em alguns consoles mais antigos). Mas, como a contagem de vértices rastreia proporcionalmente à contagem de triângulos mais ou menos um fator constante, geralmente não é uma métrica tão interessante do custo total de malha.

DMGregory
fonte
E o custo de enviar esses vértices para a memória?
Michał Leszczyński
7
A menos que você altere seu buffer de vértice a cada quadro, você paga esse custo de upload uma vez. Suas texturas e buffer de quadro provavelmente são os maiores porcos da memória de vídeo e largura de banda em qualquer quadro. Isso ainda significa que os vértices certamente não são livres, e é melhor compartilhá-los quando possível, mas os vértices não compartilhados raramente serão a razão de um jogo ter um desempenho ruim.
DMGregory
Adicionará a isso, como eu estou fazendo florestas etc no meu jogo. Quando comecei, estava inicialmente usando chamadas de empate (eu uso meu próprio mecanismo, isso pode não estar completamente alinhado à sua pergunta) para desenhar modelos apenas com verts, isso por si só estava ok, o desempenho estava bom. Mas, quando comecei a usar a indexação, obtive uma melhoria de desempenho porque algumas verts eram compartilhadas e armazenadas em cache, portanto alguns cálculos não foram feitos duas vezes. Qual é a conclusão, esse teste bruto de verts por si só não é o melhor indicador de verts vs tri. Seu pipeline pode ser afetado por muitos deles. Como outras respostas aludem.
ErnieDingo 16/05
2

Nem.

A menos que você esteja falando de um número realmente grande de tris (milhões), o que importa é:

  • Número de pixels renderizados
  • Custo do sombreador de fragmento
  • Número de chamadas de empate (com o limite fortemente dependendo do dispositivo).

24 vértices vezes 4000 cubos fornecem 96'000 vértices.

640x380 pixels fornecem 243'200 fragmentos e a maioria dos dispositivos suporta resoluções consideravelmente maiores.

Você pode executar novamente sua experiência com 1'000'000 cubos, em lote para evitar o gargalo da chamada de empate (1 modelo único para 1'000 cubos).

Pedro
fonte
2
Isso depende muito da cena e de como você está renderizando. Se você tem uma cena que possui relativamente pouco excesso, o processamento de vértices certamente pode dominar seu desempenho. Além disso, o número de chamadas de empate não é o problema (para algumas APIs), mas as alterações de estado entre as chamadas de empate.
Nicol Bolas
1

É importante notar que, se você estiver executando um aplicativo WebGL, a contagem de vértices rapidamente se tornará um gargalo em termos de tamanho do arquivo para os usuários baixarem. Mesmo número de triângulos, mas geralmente 2-3 vezes mais vértices do que o mostrado no software DCC. Um desembrulhar melhor pode ajudar muito nesse caso, tendo menos costuras.

Francisco Toledo
fonte