Quando é melhor fazer o upload de matrizes parciais do modelo no shader de vértice?

8

A partir de agora, ao renderizar minha cena e ao percorrer o gráfico da cena, para cada nó, sua matriz de modelo é calculada a partir da matriz de modelo do pai e da pose do nó de cena. Isso é bastante simples e já reduz o número de multiplicações de matrizes para uma multiplicação por nó e quadro.

Mas todas essas multiplicações de matriz precisam ser feitas na CPU e em todos os quadros para poder executar (vários consecutivos) movimentos de nós de cena muito rapidamente. A GPU, no entanto, provavelmente é muito mais adequada para realizar muitas multiplicações de matrizes, então estou pensando em enviar várias matrizes parciais de modelo para o shader de vértice, em vez de calcular tudo na CPU.

O envio de todas as partes (de modo que a pose de cada nó) para a GPU provavelmente não faz muito sentido, pois nesse caso todos os cálculos são feitos para cada vértice, em vez de cada nó, o que realmente diminuiria o desempenho. Mas talvez os nós de cena com muitos filhos ou apenas filhos não em movimento (em relação ao pai) possam ser um local para dividir a matriz do modelo e mudar as multiplicações para o sombreador.

Então, quando é melhor enviar matrizes de modelo parciais para o shader e mover a multiplicação para a GPU? Ou é simplesmente uma má idéia para isso?

Nero
fonte

Respostas:

9

Fazer matemática com uniformes é um sombreador normalmente não lhe dará nenhum desempenho ao fazê-lo na CPU. Uma CPU não é mais lenta que uma GPU na matemática matricial, apenas não é estruturada para realizar grandes quantidades de matemática em paralelo. Mas você realmente precisa fazer essa grande quantidade de matemática para obter uma vitória. Enviar dados extras para a GPU apenas para que a GPU multiplique duas matrizes juntas raramente renderá alguma coisa para você.

Agora, digamos que você tenha um buffer de matrizes de skinning. Ele pode começar a importa se você transformá-los todos para o espaço mundial na CPU ou apenas passar uma matriz extra de modelo-to-espaço-mundo para a GPU. Mas, mesmo assim, depende da sua proporção de vértices para ossos.

John Calsbeek
fonte
Eu dependi da quantidade de cálculos. A GPU é realmente rápida sobre operações matemáticas. Portanto, é uma questão de tentativa e benchmarking.
Michael IV
5

Raramente, se é que alguma vez. Você respondeu pela metade na sua própria pergunta: um shader de vértice é executado uma vez por vértice, um shader de fragmento uma vez por fragmento. Se você não estiver fazendo algo exclusivo desse vértice ou fragmento, estará literalmente fazendo exatamente a mesma coisa toda vez que invocar um sombreador. Isso não me parece mais eficiente.

Mokosha
fonte