Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





ayuda a hacer un render optimo a una esfera...

Iniciado por xeex, 06 de Agosto de 2008, 10:06:48 PM

« anterior - próximo »

Prompt

Busca códigos en internet sobre esfereras en OpenGL usando listas y vertex buffers, seguro que hay. Trata de comparar.

No se exactamente que tratas de hacer... pero mira a ver si compilas en Debug o alguna razón externa.

Saludos (no tengo mas tiempo)

xeex


shash

No dibujes cada quad por separado. Eso es equivalente a un batch por quad, lo cual es malo. Pon el glBegin (GL_QUADS)/glEnd mas arriba en la jerarquia (por ejemplo, fuera del bucle), con eso deberias ganar mas que suficiente para tus necesidades.

tamat

Cita de: shash en 08 de Agosto de 2008, 12:29:52 PM
No dibujes cada quad por separado. Eso es equivalente a un batch por quad, lo cual es malo. Pon el glBegin (GL_QUADS)/glEnd mas arriba en la jerarquia (por ejemplo, fuera del bucle), con eso deberias ganar mas que suficiente para tus necesidades.

Sip, se me adelantó shash. Piensa que en el momento que haces el glEnd es cuando se pone en marcha todo el proceso de pintado, y eso es costoso, cuantos menos Begin/End haya mejor, pero para eso tienes que organizar bien los datos, a poder ser en un Array y usar VertexArrays.
Por un stratos menos tenso

Pogacha

Ademas que estas enviando los mismos vertex una y otra vez a trabez del canal AGP practicamente 4 veces cada vertex
Usa triangle strips en vez y si es posible glDrawElements con glDrawArrays para subirlos mas eficientemente o bien dejarlos arriva en la placa de video.



xeex

hola y gracias por responder.
Bueno...si, estaba mandando vertices repetidos, cometiendo el error de no usar triangle_strip.
Bueno...corregi todo lo anterior.
Primero parto por decir que renderizando mi escena sin nada en ella obtengo 300fps, mi computador es un notebook toshiba A215 SP-4017
AMD Turion 64 X2 a 1.6 MHz, 1 GB de memoria RAM, ATI RADEON x1200 series.
Mi primera pregunta es:
1.-¿Esta bien que me de solo 300 FPS mostrando la escena sin nada en ella?
Bueno corregi los errores que tenia en el codigo, agrege triangle_strip, un displaylist para comparar con el  VBO.
Ahora, cuando muestro mi esfera de 256 meridianos y 256 paralelos,
256x256=65536 lados,
(256+1)x(256)x2 vertices(de la forma que ordene los datos esa es la cantidad de vertices que obtuve, se entiende que un vertice esta formado por 3 coordenadas x,y,z)
con un displaylist obtengo de 75-80 FPS. Para mi sorpresa cuando uso vbo solo obtuve 52-58 FPS.
el codigo del render  de la esfera con el displaylist es:

#include "allegro.h"
#include "alleggl.h"
#include <math.h>
#include <stdio.h>

float *vector;//vertex of the sphere
float *colors;//colors of the sphere
FONT *agl_font;
int fps_ant=0;
GLuint sphere_list;
int res_x=1280;
int pa=256;
int me=256;

void reshape(GLsizei w, GLsizei h);
void make_sphere();//generate sphere vertices and colors, fill "vector" with vertex and "colors" with colors
void show_fps(int a);//show FPS

void crea_displaylist_esfera()
   {         
      sphere_list=glGenLists(1);
      glNewList(sphere_list,GL_COMPILE);     
      glBegin(GL_TRIANGLE_STRIP);     
      for(int i=0;i<(pa+1)*2*me*3;++i)
         {
            glColor3f(colors[i+0],colors[i+1],colors[i+2]);glVertex3f(vector[i+0],vector[i+ 1],vector[i+ 2]);           
            i=i+2;
         }     
      glEnd();
      glEndList();
   }                 
   
void display()
   { 
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      glColor3f(255.0,255.0,255.0);
      glCallList(sphere_list);
      show_fps(fps_ant);           
      glFlush();     
      allegro_gl_flip();         
   }
void main()
   {
      allegro_init();     
      install_allegro_gl();     
      install_keyboard();
      allegro_gl_set( AGL_COLOR_DEPTH,desktop_color_depth() );
      allegro_gl_set( AGL_Z_DEPTH, 0 );
      allegro_gl_set( AGL_DOUBLEBUFFER, 1);
      allegro_gl_set( AGL_RENDERMETHOD, 1);
      allegro_gl_set( AGL_FULLSCREEN, 1);
      allegro_gl_set( AGL_STENCIL_DEPTH,0);
      allegro_gl_set( AGL_REQUIRE,AGL_COLOR_DEPTH );
      allegro_gl_set( AGL_SUGGEST,AGL_Z_DEPTH);
      allegro_gl_set( AGL_REQUIRE,AGL_DOUBLEBUFFER);
      allegro_gl_set( AGL_REQUIRE,AGL_RENDERMETHOD);
      allegro_gl_set( AGL_REQUIRE,AGL_FULLSCREEN);     
      set_gfx_mode(GFX_OPENGL_FULLSCREEN, 1280,800 , 0, 0);
     
      agl_font = allegro_gl_load_system_font("C:\WINDOWS\Fonts\arial.ttf", AGL_FONT_TYPE_OUTLINE,1,1);
     
      //fill vector with the vertex of the sphere
      //fill colors of each vertex of the sphere
      make_sphere();           
     
      reshape(SCREEN_W,SCREEN_H);     
           
      clock_t fps_t=clock();
      bool fps=false;
      int fps_f=0;     
     
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_LEQUAL);     
     
      crea_displaylist_esfera();
     
      do
         {             
            if((clock()-fps_t)/(double)CLOCKS_PER_SEC>1)
               {     
                  fps_ant=fps_f;         
                  fps_t=clock();
                  fps_f=0;
               }
            fps_f++;                                                         
            display();           
         }while(!key[KEY_ESC]);     
      free(vector);
      free(colors);
   }END_OF_MAIN();   

void reshape(GLsizei w, GLsizei h)
   {     
      glMatrixMode (GL_PROJECTION);                 
      glLoadIdentity ();                           
      glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5f, 10000.0f);
      glMatrixMode (GL_MODELVIEW);                   
      glViewport (0, 0, w, h);                       
   }

void make_sphere()
   { 
      float ratio=10;     
      int nro_lados=pa*me;//65536 faces           
      vector = (float *) malloc ((pa+1)*me*2*3*sizeof (float));
      colors = (float *) malloc ((pa+1)*me*2*3*sizeof (float));
         
      float v1x,v1y,v1z,v2x,v2y,v2z,v3x,v3y,v3z,v4x,v4y,v4z,x1,x2,x3,x4,y1,y2,z1,z2,z3,z4;
      for(int i=0;i<me;++i)
         for(int j=0;j<=pa;++j)
            { 
               //generate sphere vertexs/////////////////////////////////////////////               
               y1=2*ratio/me*i-ratio;
               y2=2*ratio/me*(i+1)-ratio;
               v1y=y1;  v2y=y2;  v3y=y2;  v4y=y1;               
                             
               x1=sin(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y1*y1);
               x2=sin(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y2*y2);
     
               v1x=x1;  v2x=x2;
               
               z1=cos(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y1*y1);
               z2=cos(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y2*y2);
               
               v1z=z1;  v2z=z2; 
               ///////////////////////////////////////////////////////////////////////
               //fill "vector" with sphere's vertexs
               vector[0+6*(i*(pa+1)+j)] =v1x;   vector[ 1+6*(i*(pa+1)+j)] =v1y;   vector[ 2+6*(i*(pa+1)+j)] =v1z;
               vector[3+6*(i*(pa+1)+j)] =v2x;   vector[ 4+6*(i*(pa+1)+j)] =v2y;   vector[ 5+6*(i*(pa+1)+j)] =v2z;               
            }
        //fill "color" of each vertex of each face   
        for(int i=0;i<(pa+1)*me*2*3;++i)   
           {
              colors[0+i]=1.f; colors[ 1+i]=0.f; colors[ 2+i]=0.f;
              colors[3+i]=0.f; colors[ 4+i]=1.f; colors[ 5+i]=0.f;
              colors[6+i]=0.f; colors[ 7+i]=0.f; colors[ 8+i]=1.f;
              colors[9+i]=1.f; colors[10+i]=0.f; colors[11+i]=1.f;             
              i=i+11;           
           }       
   }
void show_fps(int a)
   {   
       glPushMatrix();
       glLoadIdentity();       
       glTranslatef(-1,.8,-1.5);
       glScalef(.05,.05,1);
       allegro_gl_printf(agl_font,0.0 , 0.0, 0.0, makecol( 255, 255, 000), "FPS=%d",a);       
       glPopMatrix();
   }

el codigo del render  de la esfera con vbo es:

#include "allegro.h"
#include "alleggl.h"
#include <math.h>
#include <stdio.h>

GLuint vertexBuffer = 0;
GLuint colourBuffer = 0;
float *vector;//vertex of the sphere
float *colors;//colors of the sphere
FONT *agl_font;
int fps_ant=0;
int res_x=1280;
int pa=256;
int me=256;

void reshape(GLsizei w, GLsizei h);
void make_sphere();//generate sphere vertices and colors, fill "vector" with vertex and "colors" with colors
void show_fps(int a);//show FPS

void vbo()
   {         
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);             
      glVertexPointer(3, GL_FLOAT, 0, 0);             
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, colourBuffer);             
      glColorPointer (3, GL_FLOAT, 0, 0);                 
      glDrawArrays(GL_TRIANGLE_STRIP, 0,(pa+1)*2*me);
   }                           
   
void display()
   { 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       
      glColor3f(255.0,255.0,255.0);
      vbo();     
      show_fps(fps_ant);           
      glFlush();     
      allegro_gl_flip();         
   }   


void main()
   {
      allegro_init();     
      install_allegro_gl();
      install_keyboard();           
      allegro_gl_set( AGL_COLOR_DEPTH, desktop_color_depth() );
      allegro_gl_set( AGL_Z_DEPTH, 16 );
      allegro_gl_set( AGL_DOUBLEBUFFER, 1);
      allegro_gl_set( AGL_RENDERMETHOD, 1);
      allegro_gl_set( AGL_FULLSCREEN, 1);
      allegro_gl_set( AGL_STENCIL_DEPTH,0);
      allegro_gl_set( AGL_REQUIRE,AGL_COLOR_DEPTH );
      allegro_gl_set( AGL_SUGGEST,AGL_Z_DEPTH);
      allegro_gl_set( AGL_REQUIRE,AGL_DOUBLEBUFFER);
      allegro_gl_set( AGL_REQUIRE,AGL_RENDERMETHOD);
      allegro_gl_set( AGL_REQUIRE,AGL_FULLSCREEN);
      set_gfx_mode(GFX_OPENGL_FULLSCREEN, 1280,800 , 0, 0);
     
      agl_font = allegro_gl_load_system_font("C:\WINDOWS\Fonts\arial.ttf", AGL_FONT_TYPE_OUTLINE,1,1);
     
      //fill vector with the vertex of the sphere( 4 vertex for each face of the sphere)
      //fill colors of each vertex of the sphere
      make_sphere();           
     
      reshape(SCREEN_W,SCREEN_H);     
     
      glGenBuffersARB(1, &vertexBuffer);
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);   
      glBufferDataARB(GL_ARRAY_BUFFER_ARB, (pa+1)*2*me*3*4, vector, GL_DYNAMIC_DRAW_ARB);
   
      glGenBuffersARB(1, &colourBuffer);
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, colourBuffer);
      glBufferDataARB(GL_ARRAY_BUFFER_ARB, (pa+1)*2*me*3*4, colors, GL_DYNAMIC_DRAW_ARB);
   
      glEnableClientState(GL_VERTEX_ARRAY);
      glEnableClientState(GL_COLOR_ARRAY);     
           
      clock_t fps_t=clock();
      bool fps=false;
      int fps_f=0;     
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_LEQUAL);     
      do
         {                 
            if((clock()-fps_t)/(double)CLOCKS_PER_SEC>1)
               {     
                  fps_ant=fps_f;         
                  fps_t=clock();
                  fps_f=0;
               }
            fps_f++;
            display();           
         }while(!key[KEY_ESC]);           
      free(vector);
      free(colors);
   }END_OF_MAIN();   

void reshape(GLsizei w, GLsizei h)
   {     
      glMatrixMode (GL_PROJECTION);                 
      glLoadIdentity ();                           
      glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5f, 10000.0f);
      glMatrixMode (GL_MODELVIEW);                   
      glViewport (0, 0, w, h);                       
   }

void make_sphere()
   { 
      float ratio=10;
     
      int nro_lados=pa*me;//65536 faces           
      vector = (float *) malloc ((pa+1)*me*2*3*sizeof (float));
      colors = (float *) malloc ((pa+1)*me*2*3*sizeof (float));
           
      float v1x,v1y,v1z,v2x,v2y,v2z,v3x,v3y,v3z,v4x,v4y,v4z,x1,x2,x3,x4,y1,y2,z1,z2,z3,z4;
      for(int i=0;i<me;++i)
         for(int j=0;j<=pa;++j)
            { 
               //generate sphere vertexs/////////////////////////////////////////////               
               y1=2*ratio/me*i-ratio;
               y2=2*ratio/me*(i+1)-ratio;
               v1y=y1;  v2y=y2;  v3y=y2;  v4y=y1;               
                             
               x1=sin(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y1*y1);
               x2=sin(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y2*y2);

               v1x=x1;  v2x=x2;
               
               z1=cos(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y1*y1);
               z2=cos(360.0/pa*j*3.14159265358979/180.0)*sqrt(ratio*ratio-y2*y2);
               
               v1z=z1;  v2z=z2;
               ///////////////////////////////////////////////////////////////////////
               //fill "vector" with sphere's vertexs
               vector[0+6*(i*(pa+1)+j)] =v1x;   vector[ 1+6*(i*(pa+1)+j)] =v1y;   vector[ 2+6*(i*(pa+1)+j)] =v1z-20;
               vector[3+6*(i*(pa+1)+j)] =v2x;   vector[ 4+6*(i*(pa+1)+j)] =v2y;   vector[ 5+6*(i*(pa+1)+j)] =v2z-20;           
            }
        //fill "color" of each vertex of each face   
        for(int i=0;i<(pa+1)*me*2*3;++i)   
           {
              colors[0+i]=1.f; colors[ 1+i]=0.f; colors[ 2+i]=0.f;
              colors[3+i]=0.f; colors[ 4+i]=1.f; colors[ 5+i]=0.f;
              colors[6+i]=0.f; colors[ 7+i]=0.f; colors[ 8+i]=1.f;
              colors[9+i]=1.f; colors[10+i]=0.f; colors[11+i]=1.f;             
              i=i+11;           
           }       
   }
void show_fps(int a)
   {   
       glPushMatrix();
       glLoadIdentity();       
       glTranslatef(-1,.8,-1.5);
       glScalef(.05,.05,1);
       allegro_gl_printf(agl_font,0.0 , 0.0, 0.0, makecol( 255, 255, 000), "FPS=%d",a);       
       glPopMatrix();
   }


bueno mi segunda pregunta es:
2.-¿Como es posible que me de mas fps el displaylist que el vbo?...¿tengo algun error en el codigo del vbo?...¿que estoy haciendo mal?

gracias y saludos.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.