Manipulação de malha na GPU vs CPU

9

Um pouco curioso - onde você executa manipulações de malha, na CPU ou no shader? Eu tenho feito tudo na CPU e um amigo sugeriu mudar as coisas para o lado da GPU.

Se você está fazendo coisas como animações ósseas ... na GPU, como você recupera a malha? (desde que estou fazendo a detecção de colisão ...)

AnonAnon
fonte

Respostas:

13

Isso geralmente acontece na GPU, mas existem desvantagens para ambos e cabe a você decidir qual funcionará melhor para você.

Fazer a manipulação na GPU significa que você só precisa enviar os dados da malha uma vez; basta enviar as transformações da matriz para deformar. Isso é ótimo porque reduz bastante a largura de banda necessária entre CPU-> GPU. Isso também significa que você pode carregar apenas uma cópia da malha na GPU e aplicar transformações para muitas instâncias diferentes da malha. No entanto, é mais difícil ter colisões "precisas de malha". Como as transformações são feitas na GPU, você não as tem disponíveis para teste na CPU.

Fazer a manipulação na CPU significa que você tem acesso à malha transformada. Você pode acessar tudo o que precisa saber sobre isso. No entanto, isso significa que você precisa carregar toda essa malha na GPU em cada quadro. Isso também significa que você precisa fazer upload de uma malha transformada para cada instância dessa malha. Em resumo, aqui está uma lista exaustiva de prós e contras.

  • Prós para GPU

    • Carregue os dados da malha uma vez
    • Transforme-o para várias instâncias
    • Só precisa enviar as transformações matriciais
    • A GPU é muito boa em paralelizar esses tipos de coisas
  • Contras para GPU

    • Malhas transformadas não estão disponíveis para teste na CPU
  • Prós para CPU

    • As malhas transformadas estão disponíveis para testes de colisão e qualquer outra coisa necessária.
  • Contras para CPU

    • Necessidade de carregar toda a malha transformada em cada quadro
    • É necessário fazer upload de uma malha inteira para cada instância da malha

No entanto, existem maneiras de contornar os contras da GPU.

  • Não tenha colisões precisas de malha . Use algo "próximo o suficiente", como uma caixa delimitadora para toda a malha ou tenha caixas delimitadoras para cada osso da malha. A seguir, use as transformações da GPU para a malha e as transformações da CPU para as caixas delimitadoras alinhadas ao eixo que representam a malha. Você pode obter limites ainda mais precisos usando não-AABBs.

ossos de duende

  • Transforme uma cópia da malha na CPU se, e somente se, forem necessárias colisões precisas na malha . Depois que uma colisão de caixa delimitadora retornar verdadeira, transforme uma malha para corresponder às transformações na GPU e verifique as colisões para obter dados de colisão mais precisos.

Em suma, presumo que você possa ver por que é mais comum transformar na GPU

MichaelHouse
fonte
11
Por curiosidade, é realmente prático que malhas sejam transformadas na CPU, levando em consideração a complexidade das malhas em jogos modernos, o poder e as habilidades de vários núcleos de uma CPU moderna e as outras tarefas que uma CPU deve executar? Além disso, o upload para a GPU é tão lento que essa idéia nem decolou?
R4D4
Depende do jogo, mas geralmente não é prático para jogos acima de uma complexidade moderada. Quando há uma escolha tão fácil de fazer as transformações na GPU, é difícil encontrar um motivo para justificar os requisitos adicionais de recursos para fazer as transformações na CPU. O problema é mais com o envio da malha transformada para a GPU a cada quadro, que fica caro rapidamente. Como geralmente acontece com o software, cabe ao desenvolvedor tomar decisões entre complexidade e desempenho.
MichaelHouse