2010-11-06 9 views
8

Acabo de comenzar con la programación de OpenGL y estoy construyendo una aplicación de reloj. Yo quiero que se vea algo tan simple como esto: http://i.stack.imgur.com/E73ap.jpgAnti-aliasing en OpenGL

Sin embargo, mi solicitud se ve muy "anti-anti-aliasing": http://i.stack.imgur.com/LUx2v.png

He probado el método GL_SMOOTH_POLYGON mencionado en el Libro Rojo. Sin embargo, eso no parece hacer nada.

Estoy trabajando en una computadora portátil con gráficos integrados de Intel. La tarjeta doesn't support cosas como GL_ARB_multisample.

¿Cuáles son mis opciones en este momento para que mi aplicación se vea antialias?

Respuesta

27

Las tarjetas de video integradas de Intel son notorias por su falta de soporte para el antialiasing de OpenGL. Sin embargo, puedes evitarlo.

Primera opción: supersampling Manual
Hacer una textura veces 2x tan grande como la pantalla. Render su escena a la textura a través de FBO, luego renderice la textura a la mitad de tamaño para que llene la pantalla, con interpolación bilineal. Puede ser muy lento (en escenas complejas) debido al aumento de 4x en píxeles para dibujar.

Provocará débil antialiasing (así que no lo recomiendo para el software de escritorio como su reloj). Ver por sí mismo:
antialiasing vs supersampling

Segunda opción: (avanzado)
Uso de un sombreado para realizar Morphological Antialiasing. Esta es una nueva técnica y no sé cuán fácil es implementarla. Es utilizado por algunos juegos avanzados.

Tercera opción:
Use texturas e interpolación bilineal a su ventaja por emulando primitivas de OpenGL a través de texturas. La técnica se describe here.

Cuarta opción: Use una textura separada para cada elemento de su reloj.

Por ejemplo, para su flecha de la hora, no use un GL_POLYGON negro plano en forma de flecha. En su lugar, use un GL_QUAD girado, texturizado con una imagen de flecha de hora dibujada en un programa de imagen. Entonces, la interpolación bilineal se ocupará de suavizarla a medida que la rota.

Esta opción requerirá el menor esfuerzo y se ve muy bien.

quinta opción:
uso de una biblioteca que soporta software de renderizado -

  • Qt
  • Cairo
  • de Windows GDI +
  • WPF
  • XRender
  • etc

Dichas bibliotecas contienen sus propios algoritmos para la representación antialias, por lo que no dependen de su tarjeta de video para antialiasing. Las ventajas son:

  • Will rendir el mismo en todas las plataformas. (Esto no está garantizado con OpenGL en varios casos; por ejemplo, las gruesas líneas diagonales en la captura de pantalla se representan como paralelogramos, en lugar de rectángulos)
  • Tiene un gran grupo de prácticas funciones de dibujo ("drawArc", " drawText "," drawConcavePolygon ", y esos admitirán gradientes y bordes. También obtendrá cosas como una clase de imagen.)
  • Algunos, como Qt, proporcionarán mucha más funcionalidad de tipo de aplicación de escritorio. Esto puede ser muy útil incluso para una aplicación de reloj. Por ejemplo:
    • en una aplicación OpenGL, probablemente bucle cada 20 ms y vuelva a procesar el reloj, y ni se lo piense dos veces. Esto acapara los ciclos innecesarios de la CPU y activa la CPU en una computadora portátil, agotando la batería. Por el contrario, Qt es muy inteligente acerca de cuándo debe volver a dibujar partes de su reloj (por ejemplo, cuando la mitad derecha del reloj deja de estar cubierta por una ventana, o cuando su reloj mueve la flecha de minutos un paso).
    • una vez que llegue a la implementación, p. un icono de bandeja, o un cuadro de diálogo de configuración, para su reloj, una biblioteca como Qt puede hacerlo en un abrir y cerrar de ojos. Es bueno usar la misma biblioteca para todo.

La desventaja es mucho peor rendimiento, pero eso no importa en absoluto para una aplicación de reloj, y se da la vuelta cuando se tiene en cuenta la funcionalidad de volver a dibujar inteligente que he mencionado.

Para algo así como una aplicación de reloj, la quinta opción es muy recomendable. OpenGL es principalmente útil para juegos, software 3D y material gráfico intenso como visualizadores de música. Para las aplicaciones de escritorio, es de muy bajo nivel y las implementaciones difieren demasiado.

+0

Tal vez mi propia respuesta fue demasiado apresurada: asumí que el objetivo del ejercicio era utilizar OpenGL, pero tiene razón en que las bibliotecas 2D son más apropiadas. Ninguno de los efectos "3D" en el reloj de ejemplo se logra con la representación 3D real, iluminación, sombras, etc. –

+1

Inspirado por esta respuesta, le pregunté [a esta pregunta de seguimiento] (http://gamedev.stackexchange.com/q/71953/43384) que trata los detalles técnicos de la implementación de supersampling, por ejemplo, planteando la cuestión de si el filtrado bilineal es realmente el camino a seguir para el supermuestreo. – bluenote10

0

Dibuja en un objeto framebuffer al doble (o más) de la resolución final y luego usa esa imagen como una textura para un solo quad dibujado en la ventana actual.

Cuestiones relacionadas