Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Fran en 25 de Enero de 2007, 10:13:04 AM

Título: Antialiasing con OpenGL
Publicado por: Fran en 25 de Enero de 2007, 10:13:04 AM
¿Como se hace con los polígonos? No me sale.
Título: Antialiasing con OpenGL
Publicado por: Fran en 25 de Enero de 2007, 10:18:38 AM
void display(void)
{
   GLfloat position[] = { 0.0, 0.0, 1.0, 0.0 };
   GLfloat mat_cube1[] = { 0.75, 0.75, 0.0, 1.0 };
   GLfloat mat_cube2[] = { 0.0, 0.75, 0.75, 1.0 };

   if (polySmooth)
       glClear (GL_COLOR_BUFFER_BIT);
   else
       glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glPushMatrix ();
       glTranslatef (0.0, 0.0, -8.0);    
       glLightfv (GL_LIGHT0, GL_POSITION, position);

       glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE);

       glPushMatrix ();
           glRotatef (30.0, 1.0, 0.0, 0.0);
           glRotatef (60.0, 0.0, 1.0, 0.0);
           glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_cube1);
           auxSolidCube (1.0, 1.0, 1.0);
       glPopMatrix ();

       glTranslatef (0.0, 0.0, -2.0);    
       glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_cube2);
       glRotatef (30.0, 0.0, 1.0, 0.0);
       glRotatef (60.0, 1.0, 0.0, 0.0);
       auxSolidCube (1.0);

   glPopMatrix ();

   glFlush ();
}

Esto q está extraido del red book , no me funciona
Título: Antialiasing con OpenGL
Publicado por: marcode en 25 de Enero de 2007, 02:54:08 PM
falta activarlo.

glEnable(GL_POLYGON_SMOOTH);
Título: Antialiasing con OpenGL
Publicado por: Fran en 25 de Enero de 2007, 04:27:46 PM
Cita de: "marcode"falta activarlo.

glEnable(GL_POLYGON_SMOOTH);

Bueno ya. Es q eso lo hago antes. Perdón por la omisión. Pero esto te funciona?
Título: Antialiasing con OpenGL
Publicado por: marcode en 25 de Enero de 2007, 06:00:49 PM
Pues la verdad que ahora que lo pienso nunca me ha funcionado, solo con lineas y puntos. Me parece que esa función no está en la implementación y quizás no funciona en todas las tarjetas.

Prueba esto otro de cosecha propia.


DibujarCosa();

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); // o GL_FASTEST
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glPolygonMode(GL_FRONT, GL_LINE);

DibujarCosa();

glDisable(GL_BLEND);
glPolygonMode(GL_FRONT, GL_FILL);
Título: Antialiasing con OpenGL
Publicado por: Fran en 25 de Enero de 2007, 06:34:20 PM
Cita de: "marcode"Pues la verdad que ahora que lo pienso nunca me ha funcionado, solo con lineas y puntos. Me parece que esa función no está en la implementación y quizás no funciona en todas las tarjetas.

Prueba esto otro de cosecha propia.


DibujarCosa();

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); // o GL_FASTEST
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glPolygonMode(GL_FRONT, GL_LINE);

DibujarCosa();

glDisable(GL_BLEND);
glPolygonMode(GL_FRONT, GL_FILL);

:) Que truquitor...... No lo he probado pero sé que quieres hacer. Pero eso lo hará ir más lento ¿no?. Dibujo 200.000-1M triángulos. He leido algo por ahi del multisampling. Alguien sabe como funciona? Ahora cuando llegué a casa pongo las funciones a ver si alguien ha logrado que funcione y me explica como.
Título: Antialiasing con OpenGL
Publicado por: marcode en 25 de Enero de 2007, 08:51:40 PM
Claro, para tantos triángulos es una locura dibujar todo 2 veces. Esto más bien para muros y edificios, o algunas rectas que parecen serruchos y dan mucho el cante.

Pero el multisample también chupa lo suyo y no sirve para el modo ventana. si usas glut pruébalo pasando a la función de inicio GLUT_MULTISAMPLE y glEnable(GL_MULTISAMPLE). Sin glut es más coñazo iniciarlo.

Otra opción es usar un buffer de acumulación, que tiene más calidad que el multisample.