Digamos que eu tenha um modelo feito de vértices, cada um com position
, normal
, tangent
, e texcoord
atributos, onde triângulos são especificados por triplos índice.
Se focarmos apenas nos atributos do vértice, conheço duas estratégias amplas: a estrutura de matrizes e a matriz de estruturas. Também ouvi dizer que a matriz de estruturas é preferida porque aumenta a localidade da memória (e, portanto, a localidade do cache) dos atributos para um determinado vértice.
É realmente assim que isso melhora o desempenho? A principal maneira de pensar que isso aconteceria é pelos índices de vértices que exigem que o rasterizador adquira dados de vértices que há muito tempo foram despejados do cache. Se o acesso aos dados do vértice for aleatório assim, manter todos os atributos de um vértice na mesma linha de cache certamente tornaria as coisas mais rápidas, mas isso não é um problema que poderia ser atenuado principalmente pela otimização da ordem da especificação do triângulo?
Além disso, entendo que as GPUs modernas podem ser melhores para descompactar vetores longos do mesmo tipo do que vetores de estruturas de vários tipos. Seria possível que um layout de estrutura de matrizes superasse consistentemente um layout de matriz de estruturas dos mesmos dados de vértice, se a ordem do índice fosse otimizada?
fonte
Respostas:
Desculpas, eu ia adicionar um comentário ao seu tópico de perguntas, mas descobri que acabei elaborando demais. Minha experiência em desenvolvimento é do ponto de vista do DX 11, portanto, parte disso pode não ser válida no OpenGL
A localização da memória dos dados certamente desempenha um papel importante. Mas existem alguns outros itens que contribuem para isso, a largura dos dados, como você conhece. Eu tive algumas GPUs e tive um grande desempenho em algumas baseadas em certos pontos críticos. Esse é o exemplo, no meu antigo AMD r290, se bem me lembro, você poderia basicamente passar até 4 float4s para o buffer de vértice sem custo adicional acima de 1, mas depois que eu publiquei> 4, houve uma queda mensurável (no quadro taxa). Isso é puramente fora da minha lembrança e, portanto, é anedótico da melhor forma. Mas sustenta que a arquitetura da GPU está mudando o tempo todo e que técnicas de nicho que oferecem uma vantagem no desempenho hoje, talvez a desgraça do seu desempenho amanhã. EU'
Dito isto, você fez a pergunta sobre a ordem dos vértices, e certamente isso ajudará marginalmente. O ganho de desempenho é quando você combina isso com buffers de índice, o que permite ao hardware otimizar e armazenar em cache os vértices já calculados. Você certamente pode obter ainda mais ganhos com tiras de triângulo, etc., que foram encomendadas especificamente de acordo com seus pensamentos. A maioria das renderizações de modelos que eu faço são modelos otimizados baseados em índices / vértices com instanciamento, eu uso uma pequena quantidade de pesquisas para efeitos de movimento cíclico (galhos de árvores, por exemplo); nesses casos, todo o galho da árvore procura o mesmo valor. Portanto, o cache também pode ser aproveitado aqui.
Tudo o que posso dizer em resumo de mim mesmo é:
Estes são apenas alguns pensamentos e experiências que tive. Existem muitos livros por aí que você deve colocar em suas mãos sobre esses mesmos tópicos. Não vi muitos prescreverem o que você está propondo, mas isso não significa que esteja errado. Boa sorte.
fonte
Isso pode depender do hardware de destino e da API que você usará. Você pode fornecer mais informações? Aqui estão algumas práticas recomendadas (muito amplas e gerais) para o OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices
Além disso, você tem algum problema de desempenho? Ou você está apenas curioso.
fonte