2012-04-27 26 views
11

Dado que GL_LINE_SMOOTH no está acelerado por hardware ni es compatible con todas las tarjetas GFX, ¿cómo dibuja líneas suaves en modo 2D, que se verían tan bien como con GL_LINE_SMOOTH?Cómo dibujar líneas suaves en una escena 2D con OpenGL sin usar GL_LINE_SMOOTH?

Edit2: Mi solución actual es dibujar una línea a partir de 2 cuadrantes, que se desvanecen a cero transparencia desde los bordes y los colores entre esos 2 cuadrantes serían el color de línea. funciona lo suficientemente bien para la renderización básica de líneas suaves y no utiliza texturización y, por lo tanto, es muy rápido de renderizar.

+0

¿Ha descartado el uso de quad textura, o cuádruple con degradado de color? Parece una posible solución para mí, aunque parece que Edvard ya ha cubierto ese territorio. – Tim

+0

@Tim, hm, no estoy seguro si solo el cuadrante de colores funcionará exactamente igual que las líneas suaves, podría volverse demasiado agudo ... bueno, tengo que probarlo. – Rookie

+0

@Tim, lo probé ahora, y como esperaba, es demasiado nítido (o demasiado borroso), pero para mis propósitos actuales ¡funciona bien! el grosor de línea 1.7 parece coincidir muy bien con mi línea gruesa 1.1 actual. – Rookie

Respuesta

1

Actualmente estoy usando 2 o 3 cuadrantes para hacer esto, es la forma más sencilla de hacerlo.

  • Si el grosor de la línea < = 1px, solo necesita 2 quads.
  • Si el grosor de la línea es> 1px, entonces necesita agregar un tercer quad en el medio.
  • El grosor del fading edge quads no debe cambiar si el grosor de la línea es> = 1px.

En la imagen a continuación puede ver los quads con bordes azules. El color blanco significa opacidad completa y el color negro significa cero opacidad (= completamente transparente).

enter image description here

3

Activar el anti-aliasing de pantalla completa y usar un quad sería mi primera opción.

+0

Creo que el antialiasing de pantalla completa es demasiado exagerado para un juego que no procesa nada más antialias excepto estas líneas, que son una pequeña parte del juego. Por cierto, ¿por qué necesita tanto cuadrícula texturizada como AA de pantalla completa? wouldnt texturas quads ser suficiente? – Rookie

+0

Necesita ambos porque un quad no sería antialias a menos que lo alise, y si la memoria funciona (lo que no podría ser), algunos algoritmos FSAA no le gustan las líneas antialias. En cuanto a la FSAA, probablemente sea más barata que usar GL_LINE_SMOOTH en tarjetas que no aceleran el hardware. –

+0

Pero, ¿no parecería que el quad es una línea suavizada si utiliza una textura que tiene 1 píxel lleno opaco y los 2 píxeles vecinos son completamente transparentes? Havent probado aún, pero no puedo ver por qué no ... porque en mis pruebas de textura he dibujado una línea recta en la textura y luego giré los vértices cuadriculados texturizados y la línea parece una línea suavizada cuando se gira, como si tuviera un antialiasing en . – Rookie

10

Por lo tanto, desea que las líneas lisas sin:

  • línea de alisado.
  • antialiasing de pantalla completa.
  • shaders.

Alright.

Su mejor opción es usar Valve's Alpha-Tested Magnification technique. La idea básica, para sus necesidades, es crear una textura que represente la distancia desde la línea, con el centro de la textura a una distancia de 1.0. Esto probablemente podría ser una textura 1D.

Luego, utilizando las técnicas descritas en el documento (muchas de las cuales funcionan con la función fija, incluida la versión antialias), dibuje un cuadrángulo que represente sus líneas. Obviamente necesitarás mezcla alfa (y por lo tanto no es independiente de la orden). Utiliza el ancho de su línea para controlar la distancia a la que se convierte en el color apropiado, lo que le permite hacer líneas angostas o anchas.


Hacer esto con shaders es prácticamente idéntico al anterior, excepto sin la textura. En lugar de acceder a una textura de distancia, la distancia se pasa e interpola desde el sombreador de vértices. Para el borde izquierdo del cuadrante, el sombreador de vértices pasa 0. Para el borde derecho, pasa 1. Multiplica esto por 2, resta 1 y toma el valor absoluto.

Esa es su distancia de la línea (la línea es el centro del quad). Entonces simplemente use esa distancia exactamente como lo hace el algoritmo de Valve.

+0

conozco esa técnica, pero en realidad no es lo que estoy buscando y me llevaría mucha más memoria. mi solución actual con quads con colores es rápida y no ocupa ninguna memoria de textura extra. – Rookie

+0

Estoy dispuesto a aceptar la solución GLSL ahora. – Rookie

+4

@Rookie: con "mucha más memoria" se refiere a 4 KB (probablemente la asignación más pequeña posible para GPU). No necesita una textura por línea, solo un período de textura. Y como se dijo, podría ser una textura 1D; no tiene que ser particularmente grande tampoco. Una textura 16x1 'GL_LUMINANCE8' funcionaría bien. De alguna manera, no creo que te pierdas esos 4K de RAM. –

Cuestiones relacionadas