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.