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.
fonte
Respostas:
Vamos imaginar uma grande malha de grade, como uma que podemos usar para terrenos. Vamos render
n
triâ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/2
vértices.Para renderizar isso, precisamos:
Execute o vertex shader pelo menos
n/2
vezes("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)
n
Triâ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
3n
vértices para renderizar, seis vezes mais do que antes! Nossos passos são ...Execute os
3n
tempos 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)
n
Triâ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.
fonte
Nem.
A menos que você esteja falando de um número realmente grande de tris (milhões), o que importa é:
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).
fonte
É 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.
fonte