2010-05-06 18 views
5

He estado intentando alias anti con OGL. Encontré un fragmento de código que se supone que hace esto, pero no veo ningún antialiasing. También reinicié mi configuración en el Panel de control de Nvidia pero no tuve suerte.OpenGL antialiasing no funciona

¿Este código de hecho antialias el cubo?

GLboolean polySmooth = GL_TRUE; 
static void init(void) 
{ 
    glCullFace (GL_BACK); 
    glEnable (GL_CULL_FACE); 
    glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE); 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
} 

#define NFACE 6 
#define NVERT 8 
void drawCube(GLdouble x0, GLdouble x1, GLdouble y0, 
       GLdouble y1, GLdouble z0, GLdouble z1) 
{ 
    static GLfloat v[8][3]; 
    static GLfloat c[8][4] = { 
     {0.0, 0.0, 0.0, 1.0}, {1.0, 0.0, 0.0, 1.0}, 
     {0.0, 1.0, 0.0, 1.0}, {1.0, 1.0, 0.0, 1.0}, 
     {0.0, 0.0, 1.0, 1.0}, {1.0, 0.0, 1.0, 1.0}, 
     {0.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0} 
    }; 

/* indices of front, top, left, bottom, right, back faces */ 
    static GLubyte indices[NFACE][4] = { 
     {4, 5, 6, 7}, {2, 3, 7, 6}, {0, 4, 7, 3}, 
     {0, 1, 5, 4}, {1, 5, 6, 2}, {0, 3, 2, 1} 
    }; 

    v[0][0] = v[3][0] = v[4][0] = v[7][0] = x0; 
    v[1][0] = v[2][0] = v[5][0] = v[6][0] = x1; 
    v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0; 
    v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1; 
    v[0][2] = v[1][2] = v[2][2] = v[3][2] = z0; 
    v[4][2] = v[5][2] = v[6][2] = v[7][2] = z1; 

#ifdef GL_VERSION_1_1 
    glEnableClientState (GL_VERTEX_ARRAY); 
    glEnableClientState (GL_COLOR_ARRAY); 
    glVertexPointer (3, GL_FLOAT, 0, v); 
    glColorPointer (4, GL_FLOAT, 0, c); 
    glDrawElements(GL_QUADS, NFACE*4, GL_UNSIGNED_BYTE, indices); 
    glDisableClientState (GL_VERTEX_ARRAY); 
    glDisableClientState (GL_COLOR_ARRAY); 
#else 
    printf ("If this is GL Version 1.0, "); 
    printf ("vertex arrays are not supported.\n"); 
    exit(1); 
#endif 
} 
/* Note: polygons must be drawn from front to back 
* for proper blending. 
*/ 
void display(void) 
{ 
    if (polySmooth) { 
     glClear (GL_COLOR_BUFFER_BIT); 
     glEnable (GL_BLEND); 
     glEnable (GL_POLYGON_SMOOTH); 
     glDisable (GL_DEPTH_TEST); 
    } 
    else { 
     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glDisable (GL_BLEND); 
     glDisable (GL_POLYGON_SMOOTH); 
     glEnable (GL_DEPTH_TEST); 
    } 

    glPushMatrix(); 
     glTranslatef (0.0, 0.0, -8.0);  
     glRotatef (30.0, 1.0, 0.0, 0.0); 
     glRotatef (60.0, 0.0, 1.0, 0.0); 
     drawCube(-0.5, 0.5, -0.5, 0.5, -0.5, 0.5); 
    glPopMatrix(); 

    glFlush(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(30.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 
void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) { 
     case 't': 
     case 'T': 
     polySmooth = !polySmooth; 
     glutPostRedisplay(); 
     break; 
     case 27: 
     exit(0); /* Escape key */ 
     break; 
     default: 
     break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB 
         | GLUT_ALPHA | GLUT_DEPTH); 
    glutInitWindowSize(200, 200); 
    glutCreateWindow(argv[0]); 
    init(); 
    glutReshapeFunc (reshape); 
    glutKeyboardFunc (keyboard); 
    glutDisplayFunc (display); 
    glutMainLoop(); 
    return 0; 
} 

Gracias

+0

Cuando ejecuta este código, ¿qué hace? – fbrereto

+0

Muestra un cubo no centrado – jmasterx

Respuesta

0

¿Usted ha intentado suministrar GLUT_MULTISAMPLE a la llamada glutInitDisplayMode(..)? Sin embargo, no es seguro que la implementación de su exceso lo respalde.

+0

Esto no funcionó, GLUT_MULTISAMPLE no hizo nada – jmasterx

+0

@ user146780 Lamento escuchar eso. Entonces parece que la versión GLUT que está utilizando no creará ventanas con capacidades múltiples. http://linux.die.net/man/3/glutinitdisplaymode ¿También hiciste 'glEnable (GL_MULTISAMPLE_ARB);'? – epatel

1

que realmente debería considerar a

  • encontrar una mejor (léase "al día") fuente de información que el libro rojo
  • uso multimuestreo/supersampling en lugar de la GL_POLYGON_SMOOTH casi obsoleta-

En su problema:

  • ¿Cuál es su tarjeta gráfica?
  • ¿Qué versión de OpenGL estás usando?
  • ¿Está ordenando en profundidad todos sus polígonos?
+0

9400M G, 2.0, sí. – jmasterx

Cuestiones relacionadas