Maneira mais rápida de desenhar pequenas partículas em opengl?

8

Pergunta rápida: Qual é o método mais rápido para renderizar uma grande variedade de partículas 4x4 / 8x8 em opengl? Atualmente eu gasto 2 triângulos para cada um, mas acho que é lento, então eu realmente gostaria de saber se estou fazendo certo .....

user1010005
fonte
11
Apenas um lembrete de que, como se trata de uma questão de desempenho, você deve medir o desempenho em sua plataforma de destino, (a) para ter certeza de que é realmente caro o suficiente para valer a pena se preocupar e (b) para testar a aceleração de qualquer solução proposta.
Nathan Reed

Respostas:

6

Você pode desenhar pontos com o OpenGL.

Você deseja chamar glDrawArrays () ou glDrawElements () com GL_POINTS (em vez de GL_TRIANGLE_STRIP ou o que estiver usando.)

Isso atrairá pontos para a tela com base no tamanho atual do ponto, que você pode definir via glPointSize () . Você também pode usar o pseudônimo desses pontos, mas, na minha experiência, nem todos os drivers / hardware suportam pontos de pseudônimo.

Você não pode texturizar esses pontos; eles são apenas uma única cor.

entalhe
fonte
Obrigado pela dica. Você sabe se eu poderia fazer o método GL_POINT com shaders para que eu possa mapear uma textura para eles também?
usar o seguinte comando
11
Você pode usar com sombreadores, mas há apenas um vértice para um ponto (no centro), portanto, pode ser difícil encontrar os cabos de aço. stackoverflow.com/questions/5839095/... parece que fala um pouco sobre isso ...
notlesh
Você também pode definir um sprite de ponto com GL_POINTS.
9788 Mick
11
@ user1010005 Para texturizar o mapa com GL_POINTS, você pode procurar em GL_POINT_SPRITE_ARB. Além disso, tenho certeza de que os pontos sempre acabam ocupando o mesmo número de pixels na tela, não importa o quão perto ou longe você esteja deles.
Kevintodisco 9/04
@ktodisco, você pode passar o tamanho do ponto como um atributo. eu consegui um efeito decente de estrela fazendo isso. para alterar o tamanho do vert shader, você atribuir a variável gl_PointSize
notlesh
3

No núcleo OpenGL 3.2 e superior, os shaders de geometria estão disponíveis para uso. Para dar uma breve visão geral, você só diria ao OpenGL para desenhar os pontos que representam as posições de suas partículas, e esses pontos passariam pelo shader de vértice normalmente, mas quando eles chegarem ao shader de geometria, ele constrói o retângulo (fora de dois tris) emitindo vértices para o próximo estágio do pipeline. Junto com os vértices, você pode gerar programaticamente coordenadas normais e de textura.

Como tudo isso é feito em hardware, tenho certeza de que é a maneira mais rápida no momento de renderizar partículas de sprites pontuais.

kevintodisco
fonte
11
Essa é provavelmente uma solução melhor que a GL_POINTS, mas não funcionará para implementações mais antigas do OpenGL (e OpenGL ES).
notlesh
Parece ótimo, mas eu pretendo porta meu jogo para a plataforma android :(
user1010005
2
@ user1010005 Apenas uma dica, você deve mencionar que, quando você faz a pergunta, por isso sabemos o restrições para trabalhar com :)
kevintodisco
Eu sou um iniciante com opengl desculpe D:
user1010005 9/12/12
Gostaria de AMO para ver o shader de geometria disponibilizado em OpenGL ES. ) =
notlesh