1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C|OpenGL

Discussão em 'Programação' iniciada por Jota.Ce, 5 de Maio de 2009. (Respostas: 7; Visualizações: 1006)

  1. Jota.Ce

    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?
     
  2. Baderous

    Baderous Banido

    Porque é que estás a desenhar apenas 1 esfera na DisplayList em vez de desenhares logo todas?
     
  3. Jota.Ce

    Jota.Ce Power Member

    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.
     
  4. S.T.E.E.L.

    S.T.E.E.L. Power Member

    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?
     
  5. Jota.Ce

    Jota.Ce Power Member

    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
     
  6. S.T.E.E.L.

    S.T.E.E.L. Power Member

    Já experimentaste isto?

    http://www.songho.ca/opengl/gl_vbo.html

    Outra coisa, não sei se fará diferença, mas na função glutsolidsphere experimenta também usar valores múltiplos de 2 para os parâmetros slices e stacks.
     
  7. Jota.Ce

    Jota.Ce Power Member

    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!
     
  8. S.T.E.E.L.

    S.T.E.E.L. Power Member

    Sorry, não tinha visto. :007:
     

Partilhar esta Página