• Martes 19 de Marzo de 2024, 07:38

Autor Tema:  Dibujado se sobrepone al anterior  (Leído 3622 veces)

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Dibujado se sobrepone al anterior
« en: Martes 13 de Enero de 2009, 01:07 »
0
Qué tal, recién le estoy echando un vistazo a OpenGL, estoy checando unos ejemplos de la Superbiblia :).

Tengo un problema, el siguiente código:

Código: Text
  1.  
  2. // Points.c
  3. // OpenGL SuperBible
  4. // Demonstrates OpenGL Primative GL_POINTS
  5. // Program by Richard S. Wright Jr.
  6.  
  7. #include "../../shared/gltools.h"   // OpenGL toolkit
  8. #include <math.h>
  9. #include <cstdio>
  10.  
  11.  
  12. // Define a constant for the value of PI
  13. #define GL_PI 3.1415f
  14.  
  15. // Rotation amounts
  16. static GLfloat xRot = 0.0f;
  17. static GLfloat yRot = 0.0f;
  18.  
  19.  
  20. // Called to draw scene
  21. void RenderScene(void)
  22.     {
  23.     GLfloat x,y,z,angle; // Storeage for coordinat
  24.     // Save matrix state and do the rotation
  25.     glPushMatrix();
  26.     glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  27.     glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  28.  
  29.     // Call only once for all remaining points
  30.     glBegin(GL_POINTS);
  31.  
  32.     z = -50.0f;
  33.     for(angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f)
  34.     {
  35.         x = 50.0f*sin(angle);
  36.         y = 50.0f*cos(angle);
  37.    
  38.         // Specify the point and move the Z value up a little  
  39.         glVertex3f(x, y, z);
  40.         z += 0.5f;
  41.     }
  42.  
  43.     // Done drawing points
  44.     glEnd();
  45.  
  46.     // Restore transformations
  47.     glPopMatrix();
  48.  
  49.     // Flush drawing commands
  50.     glutSwapBuffers();
  51.     }
  52.  
  53. // This function does any needed initialization on the rendering
  54. // context.
  55. void SetupRC()
  56.     {
  57.     // Black background
  58.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
  59.  
  60.     // Set drawing color to green
  61.     glColor3f(0.0f, 1.0f, 0.0f);
  62.     }
  63.  
  64. void SpecialKeys(int key, int x, int y)
  65.     {
  66.     if(key == GLUT_KEY_UP)
  67.         xRot-= 5.0f;
  68.  
  69.     if(key == GLUT_KEY_DOWN)
  70.         xRot += 5.0f;
  71.  
  72.     if(key == GLUT_KEY_LEFT)
  73.         yRot -= 5.0f;
  74.  
  75.     if(key == GLUT_KEY_RIGHT)
  76.         yRot += 5.0f;
  77.  
  78.     if(key > 356.0f)
  79.         xRot = 0.0f;
  80.  
  81.     if(key < -1.0f)
  82.         xRot = 355.0f;
  83.  
  84.     if(key > 356.0f)
  85.         yRot = 0.0f;
  86.  
  87.     if(key < -1.0f)
  88.         yRot = 355.0f;
  89.  
  90.     // Refresh the Window
  91.     glutPostRedisplay();
  92.     }
  93.  
  94.  
  95. void ChangeSize(int w, int h)
  96.     {
  97.     GLfloat nRange = 1000.0f;
  98.  
  99.     // Prevent a divide by zero
  100.     if(h == 0)
  101.         h = 1;
  102.  
  103.     // Set Viewport to window dimensions
  104.     glViewport(0, 0, w, h);
  105.  
  106.     // Reset projection matrix stack
  107.     glMatrixMode(GL_PROJECTION);
  108.     glLoadIdentity();
  109.  
  110.     // Establish clipping volume (left, right, bottom, top, near, far)
  111.     if (w <= h)
  112.         glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
  113.     else
  114.         glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
  115.  
  116.     // Reset Model view matrix stack
  117.     glMatrixMode(GL_MODELVIEW);
  118.     glLoadIdentity();
  119.     }
  120.  
  121. int main(int argc, char* argv[])
  122.     {
  123.     glutInit(&argc, argv);
  124.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  125.     glutCreateWindow("Points Example");
  126.     glutReshapeFunc(ChangeSize);
  127.     glutSpecialFunc(SpecialKeys);
  128.     glutDisplayFunc(RenderScene);
  129.     SetupRC();
  130.     glutMainLoop();
  131.  
  132.     return 0;
  133.     }
  134.  
  135.  
Dibuja unos puntos en espiral y permite mover la perspectiva con las flechas del teclado, lo probé hace algunas semanas, y funcionaba muy bien, pero hoy intento de nuevo y ahora al intentar mover, el dibujo anterior no se borra, sino que las nuevas posiciones se van sobreponiendo a las anteriores, quedando todo encimado tras intentar mover varias veces.

¿Alguien sabe si es posible modificar esto en código? Porque por ahora mi única idea es algo con drivers o versión de alguna librería, acabo de instalar la última versión de DirectX pero no sé si tenga algo que ver con esto.

Gracias de antemano por cualquier ayuda que puedan darme :).
La imaginación es el límite.
Hardware & Software | Mexchip

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #1 en: Martes 13 de Enero de 2009, 01:56 »
0
Código: C
  1.  void RenderScene(void)
  2.      {
  3.      // Limpiamos todos los pixeles
  4.      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  5.      GLfloat x,y,z,angle; // Storeage for coordinat
  6.      // Save matrix state and do the rotation
  7.      glPushMatrix();
  8.      glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  9.      glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  10.  
  11.      // Call only once for all remaining points
  12.      glBegin(GL_POINTS);
  13.  
  14.      z = -50.0f;
  15.      for(angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f)
  16.      {
  17.          x = 50.0f*sin(angle);
  18.          y = 50.0f*cos(angle);
  19.    
  20.          // Specify the point and move the Z value up a little  
  21.          glVertex3f(x, y, z);
  22.          z += 0.5f;
  23.      }
  24.  
  25.      // Done drawing points
  26.      glEnd();
  27.  
  28.      // Restore transformations
  29.      glPopMatrix();
  30.  
  31.      // Flush drawing commands
  32.      glutSwapBuffers();
  33.      }
  34.  
Sino funciona, ponlo en el SetupRC.
PD: Te recomiendo OpenGL Programming Guide editorial Addison-Wesley  ;)
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujado se sobrepone al anterior
« Respuesta #2 en: Martes 13 de Enero de 2009, 08:03 »
0
Idi**a de mi, ahora mismo que probé en linux encontré el error :brickwall:.
Efectivamente, no estaba borrando :brickwall:. eso me pasa por creer ciegamente que el código estaba intacto desde la última vez que lo había visto funcionar :p.

su, muchas gracias por la ayuda, y también por la recomendación, cuando estaba por comprarme un libro para empezar a echarle un vistazo a OpenGL me decidí por el de la Superbiblia porque el que comentas lo tiene mi asesor, y se supone que me lo prestaría :P (mañana mismo se lo pido ;)).

Gracias :).
« última modificación: Miércoles 14 de Enero de 2009, 14:09 por Geo »
La imaginación es el límite.
Hardware & Software | Mexchip

hdsk

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #3 en: Martes 13 de Enero de 2009, 14:14 »
0
Hola,

El problema que tienen es porque antes de dibujar siempre tienen que hacer un glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Ustedes compilan en windows con MINGW y GLUT?, si saben como hacer eso please helpme :-)

Salu2

BlackWind

  • Miembro activo
  • **
  • Mensajes: 89
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #4 en: Jueves 15 de Enero de 2009, 02:25 »
0
Hola Geo,

Si no tienes inconveniente de trabajar en windows en lugar de linux, te recomendaria que lo hicieras sobre windows, ya que las actualizaciones de linux para opengl son malisimas, a veces genera muchos problemas (no lo digo por el problema que te paso, si no por otros)

saludos,

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujado se sobrepone al anterior
« Respuesta #5 en: Jueves 15 de Enero de 2009, 19:34 »
0
Blackwind, gracias por el consejo :). De hecho, mi proyecto lo estoy desarrollando en Windows, solo tratando de utilizar en su mayoría librerías que también estén disponibles en Linux para hacer más sencilla una futura portación :).
La imaginación es el límite.
Hardware & Software | Mexchip

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #6 en: Jueves 15 de Enero de 2009, 20:39 »
0
Cita de: "BlackWind"
Hola Geo,

Si no tienes inconveniente de trabajar en windows en lugar de linux, te recomendaria que lo hicieras sobre windows, ya que las actualizaciones de linux para opengl son malisimas, a veces genera muchos problemas (no lo digo por el problema que te paso, si no por otros)

saludos,

No puedo estar de acuerdo con eso...
http://graphcomp.com/pogl.cgi?v=0111s3m3
Citar
While Windows and Linux generally perform equally well for most applications (Apache, MySQL, Perl, etc), this is not the case for OpenGL.

Using both C and Perl benchmarks, Linux performs up to 10X faster than Windows (Vista) using POGL's test.pl FBO test app.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

hdsk

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #7 en: Jueves 15 de Enero de 2009, 20:46 »
0
En realidad podes trabajar bien en Linux, pero tiene razón en que algunas aplicaciones Linux con OpenGL no funcionan bien dependiendo de la tarjeta grafica que tengas en tu equipo.

El problema es que uno muchas veces activa unas opciones para que le funcione el lindo cubo 3D para cambiar de escritorio de una forma mas bonita, pero con algunas tarjetas graficas eso deja como efecto secundario un flickering (parpadeo) en las aplicaciones linux que utilizan OpenGL.

Esto sucede porque se activan algunas opciones para acelerar los gráficos que no funcionan bien con todas las tarjetas. Igual es facil de configurar para que todo funcione bien, pero se pierde la aceleración.

En cuanto a la performance es bien sabido que OpenGL no aprovecha al maximo el hardware gráfico de la forma que lo hace DirectX pero la gran diferencia es que OpenGL esta extendido a muchos mas sistemas y DirectX es algo 100% Windows.

Salu2

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #8 en: Jueves 15 de Enero de 2009, 21:05 »
0
Cita de: "hdsk"
En realidad podes trabajar bien en Linux, pero tiene razón en que algunas aplicaciones Linux con OpenGL no funcionan bien dependiendo de la tarjeta grafica que tengas en tu equipo.

El problema es que uno muchas veces activa unas opciones para que le funcione el lindo cubo 3D para cambiar de escritorio de una forma mas bonita, pero con algunas tarjetas graficas eso deja como efecto secundario un flickering (parpadeo) en las aplicaciones linux que utilizan OpenGL.

Esto sucede porque se activan algunas opciones para acelerar los gráficos que no funcionan bien con todas las tarjetas. Igual es facil de configurar para que todo funcione bien, pero se pierde la aceleración.

En cuanto a la performance es bien sabido que OpenGL no aprovecha al maximo el hardware gráfico de la forma que lo hace DirectX pero la gran diferencia es que OpenGL esta extendido a muchos mas sistemas y DirectX es algo 100% Windows.

Salu2
Por algo existe Mesa 3D... ademas el problema es generalmente por la configuracion que se le da a X11.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

hdsk

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Dibujado se sobrepone al anterior
« Respuesta #9 en: Jueves 15 de Enero de 2009, 21:20 »
0
Tal cual lo que decis. Personalmente he visto que eso del flickering pasa con varias tarjetas graficas principalmente de la linea intel. No obstante desactivando compiz se arregla.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dibujado se sobrepone al anterior
« Respuesta #10 en: Jueves 15 de Enero de 2009, 23:20 »
0
Pero MESA ¿no era una implementación software?
Perdón, ya leí en la introducción de la página oficial:
Citar
A variety of device drivers allows Mesa to be used in many different environments ranging from software emulation to complete hardware acceleration for modern GPUs.
La imaginación es el límite.
Hardware & Software | Mexchip