Openpen ES 2.0: Buscando dicas de desempenho / otimização de VBO para muitos vértices móveis

Na minha tentativa contínua de converter para o OpenGL ES 2.0 a partir do ES 1.x, atualmente estou convertendo algum código para usar Vertex Buffer Objects ('VBOs') em vez das chamadas glDrawArrays sem buffer existente

Configurei os VBOs e os fiz funcionar, mas atingi um dilema de design e agradeceria o conselho de alguém mais experiente com o OpenGL ES 2.

Quero desenhar um monte de sprites poligonais que se movem com frequência. Isso ocorre porque eles são corpos dinâmicos do Box2D, se você estiver familiarizado com o Box2D. Esses corpos de polígono são gerados pelo uso de GL_TRIANGLE_FAN, o que é um pouco crítico, pois GL_POLYGON não está disponível no ES 2.

Os polígonos têm outros atributos, como cores, quepod ser alterada em algum momento do ciclo de vida do aplicativo, mas são as posições dos vértices que garantem a alteração de quase todos os quadro

Os polígonos são agrupados no jogo, por isso é minha intenção gerenciar e desenhar uma matriz de vértices / cores intercaladas por grupo e não por corpo, na tentativa de minimizar a comunicação da GP

Há várias rotas para o sucesso aqui, eu tenho lido Guia de programação do OpenGL ES 2.0 para buscar o máximo de informações e dicas de otimização que puder sobre os VBOs, e aqui está o que eles dizem:

Os dados intercalados são favoráveis, já que "os dados dos atributos de cada vértice podem ser lidos de forma sequencial".

O livro recomenda que "se um subconjunto de dados de atributos de vértices precisar ser modificado .. alguém pode .. armazenar atributos de vértices que são de natureza dinâmica em um buffer separado".

A recomendação é "usar GL_HALF_FLOAT_OES sempre que possível", principalmente para cores, pois locais de vértices não projetados podem exceder esse requisito de espaço.

glMapBufferOES só deve ser usado se todo o buffer estiver sendo atualizado e, mesmo nesse caso, a operação "ainda pode ser caro comparado ao glBufferData".

Aqui estão minhasquestõe:

Se usar GL_TRIANGLE_FAN como o modo de desenho, isso me força a armazenar uma VBO por corpo e não por grupo? Ou um local comum de vértice para 'finalizar' o ventilador e o corpo atual fará com que um novo ventilador seja desenhado para o próximo corpo em um grupo VBO?

Devo intercalar todos os meus dados, apesar das localizações dos vértices serem atualizadas em alta frequência ou devo separar todas elas / apenas as localizações no seu próprio VBO?

Seguindo as recomendações do livro acima, presumivelmente eu deveria glBufferData meus locais de vértice toda vez que atualizar a renderização, em vez de usar glMapBufferOES ou glBufferSubData para atualizar os locais em buffer?

Existem funções / opções de design não mencionadas que eu deveria estar utilizando para melhorar o desempenho em um contexto de polígonos com muitos movimento

Devo tentar usar GL_HALF_FLOAT_OES para armazenamento de cores, ou seja, no espaço de 2 carros alegóricos, em vez disso, armazeno 4 números semi-flutuantes? Se a resposta for sim, eu usaria qualquer tipo de GL com metade do tamanho de GLfloat para cada cor e, em seguida, OR bit a bit, e depois inseri-los na matriz de atributos apropriada?

Uma vez que criei X muitos VBOs, são as únicas chamadas que preciso fazer para cada renderização glBindBuffer, glBufferData e glDrawElements / Arrays, ou também devo chamar glEnableVertexAttribArray e glVertexAttribPointer cada vez que uso glBufferData?

Ficaria extremamente grato por mais conselhos sobre isso, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion