Líneas con anti-aliasing en OpenGL

Para dibujar líneas suaves (con anti-aliasing) en OpenGL, se deben tener en cuenta varios detalles:

  • El blending debe estar activo mientras se está pintando
  • Debe haberse definido una función de blending específica
  • El suavizado de líneas debe estar activado
  • En algunos casos, un hint para el pintado de líneas suaves debe haberse definido

Las siguientes lineas de código son las llamadas OpenGL necesarias para obtener lineas suaves:

1
2
3
4
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

La siguiente imagen muestra la diferencia entre pintar lineas con y sin anti-aliasing:

Comparison between non-antialiased lines and antialiased lines

Reconstrucción de la posición de un pixel

En algunas ocasiones podemos necesitar conocer la posición de un pixel en espacio de cámara desde un fragment program. Esto normalmente es necesario en operaciones de postproceso, donde típicamente (después de pintar toda la escena en un FBO (frame buffer object) en un primer paso), en un segundo paso se envía a pintar un quad que cubre todo el area de la pantalla, texturado con la información de la escena (normales, profundidad, material, etc) y ejecutando un fragment program específico (que se encarga de los cálculos de postproceso).

Entonces, durante este postproceso, cada fragmento de este quad se corresponde con una pequeña porción de superficie en la escena pintada anteriormente, aunque en este momento sólo conocemos su posición dentro del quad pintado.

La pregunta es: ¿Cuál era su posición dentro de la escena original en espacio de cámara?
Continuar leyendo