Gostaria de desenhar um grande número (vários milhares) de malhas simples (cada uma talvez ... um máximo de 50 triângulos, mas mesmo esse é um limite superior muito grande), todos exatamente iguais.
Como uma maneira simples de força bruta, agora eu estou apenas fazendo milhares de chamadas de empate, onde apenas altero as matrizes de transformação de que os shaders precisam e depois desenha os mesmos objetos novamente.
É claro que isso é terrivelmente lento, já que (eu acho) existem muitas chamadas de empate para o driver e meu PC lidar com eficiência.
O que posso fazer para torná-lo mais rápido?
Respostas:
A solução para isso é instanciar. Este tutorial explica alguns métodos de instanciamento. Se você tiver
ARB_draw_instanced
eARB_instanced_arrays
, use-os.A idéia geral é armazenar todas as transformações de suas malhas em um objeto de buffer separado e vinculá-lo a uma matriz de atributos que usa um "vértice" por instância via
glVertexAttribDivisor
.Se, depois disso, você ainda não estiver executando o mais rápido que deseja, provavelmente estará vinculado ao processador de vértices. Faça o descarte de frustum nas malhas e, de preferência, construa uma BVH para atravessar, em vez de fazer o abate em todas as malhas de maneira independente.
fonte
glVertexAttribDivisor
(que não é obsoleto ou desatualizado por qualquer meio) tem o benefício de não ter um limite superior na contagem de instâncias. O desempenho tem sido historicamente melhor que os buffers uniformes, mas provavelmente é o mesmo ou muito semelhante agora, e os dois lados fazem o trabalho.