C|OpenGL

Jota.Ce

Power Member
Já andei a pesquisar, mas gostaria de saber a vossa opinião:
em OpenGL, qual acham que será a melhor maneira (a nível de performance) de fazer render a cerca de 1 milhão de esferas?
A posição já está calculada previamente e é só aceder à estrutura para obter esse valor.
Guardar a esfera numa display list e depois invocar essa list para cada posição não é suficiente rápido. Que outras soluções conhecem?
 
Porque é que estás a desenhar apenas 1 esfera na DisplayList em vez de desenhares logo todas?

1º porque são todas iguais.
2º porque a cada frame vão (todas elas) ter posições diferentes e se as pusesse todas na mesma displaylist só as poderia mexer como um todo.
 
Poderias especificar quais os parâmetros da esfera, de acordo com a ( que presumo que estás a usar ) função qualquer-coisa-a-ver do opengl? :D E já agora, as especificações da máquina em que queres fazer isso?
 
A função que desenha a esfera é esta:
Código:
hydrogen = glGenLists(1);
glNewList(hydrogen,GL_COMPILE);
glPushMatrix();
glColor3f(0.9,0.9,0.9);
glutSolidSphere(0.5,10,10);
glPopMatrix();
glEndList();

Depois na renderscene faço apenas isto (irá ser mais complexo, mas apra já está assim para testes):
Código:
while(i<1000){
	drawAtom((float) i, (float) i, (float) i);
	i++;
	}

A função drawAtom é esta:
Código:
void drawAtom(float posX, float posY, float posZ){
	glPushMatrix();
	glTranslatef(posX,posY,posZ);
	glCallList(otherAtom);
	glPopMatrix();
}

A ideia do projecto é desenhar proteinas (ou outro tipo de moléculas) obtendo a posição de cada partícula num ficheiro. Como a animação a representar terá no máximo cerca de 60 frames (poderá ter apenas 20), se for renderizada a 3fps, o resultado final será aceitável.
Vocês podem-se questionar: "e porque não fazer previamente o render da animação toda e depois mostrar a sequência de imagens?"
Não por uma razão muito simples, tem que ser interactivo, isto é, rodar a proteína, fazer zoom in/out, etc.
Claro que com os 3fps os "controlos" tamém irão ficar muito ranhosos, mas para já só me estou a preocupar com o render básico das partículas.

A máquina em que isto vai correr:
CPU: Intel Core 2 Duo T9400 (2.53GHz, 6Mb de cache)
RAM: 4Gb DDR3 a 1067MHz
Gráfica: NVidia 9600M GT 512Mb
Disco: 250Gb @ 7200rpm
 
Já estou a usar valores múltiplos de 2:
Código:
glutSolidSphere(0.5,[B]10[/B],[B]10[/B]);
Já tinha ponderado os VBOs mas ao contrário das listas tenho que guardar lá a posição dos vertexes, e como são vários para cada esfera, penso que me complicará ainda mais o código (e pelo que andei a ler nalguns sites o ganho em performance não será assim tão grande).
Obrigado pela ajuda na mesma!
 
Back
Topo