2011-04-04 18 views
5

Actualmente estoy buscando escribir un editor de texto para sistemas Linux que resalte texto/fuente particular que implique la representación de OpenGL. ¿Alguien tiene sugerencias para una biblioteca de renderizado de gráficos C++ que funciona bien con Linux (ubuntu en particular por ahora)?Realización de un editor de texto en 3D en C++

¡Y se agradece enormemente el consejo sobre por dónde empezar con el renderizado de texto en 3D!

EDITAR: Solo para aclarar el renderizado, el texto en 3D es un requisito estricto del proyecto.

+1

has publicado una recompensa; por lo que parece que todavía no estás satisfecho con las respuestas que has recibido. ¿Podría agregar detalles sobre lo que está buscando? – JCooper

+0

Lo que me gustaría hacer es un editor de texto que tenga resaltado de sintaxis que use algunos objetos 3d. No solo estoy buscando la representación de fuentes en OpenGL aunque esto sería un comienzo. Algunas de las respuestas fueron desde una perspectiva de Windows, que no era la plataforma a la que apuntaba. Básicamente, me gustaría encontrar una biblioteca que pueda renderizar texto en 3D en una variedad de superficies diferentes, pero si no hay ninguna, espero obtener algunos consejos sobre dónde comenzar con la construcción de dicha biblioteca. – shuttle87

+0

¿Qué quiere decir "en una variedad de superficies diferentes"? ¿Quieres renderizar el texto alrededor de un cilindro o esfera? – JCooper

Respuesta

4

utilizo FTGL, que se basa en la parte superior de freetype. Para crear 3D, texto extruido, hago estas llamadas:

#include <FTGL/ftgl.h> 
#include <FTGL/FTFont.h> 
... 
FTFont* font = new FTExtrudeFont("path_to_Fonts/COOPBL.ttf"); 
font->Depth(.5); // Text is half as 'deep' as it is tall 
font->FaceSize(1); // GL unit sized text 
... 
FTBBox bounds = font->BBox("Text"); 
glEnable(GL_NORMALIZE); // Because we're scaling 
glPushMatrix(); 
glScaled(.02,.02,.02); 
glTranslated(-(bounds.Upper().X() - bounds.Lower().X())/2.0,yy,zz); // Center the text 
font->Render("Text"); 
glPopMatrix(); 
glDisable(GL_NORMALIZE); 
9

Básicamente, hay sólo tres maneras de hacer esto a nivel de OpenGL:

Raster Fuentes.

Utilice glBitmap o glDrawPixels para dibujar un grupo rectangular de píxeles en la pantalla. Las desventajas de hacer esto son muchas: Los datos que describen cada carácter se envían desde su CPU a la tarjeta gráfica en cada cuadro, y para cada carácter del marco. Esto puede significar un ancho de banda significativo.
La implementación subyacente de OpenGL casi seguramente tendrá que 'columpiar' los datos de la imagen de alguna manera en su camino entre la CPU y el frame-buffer.
Muchos chips de gráficos 3D no están diseñados para dibujar bitmaps en absoluto. En este caso, el controlador de software OpenGL debe esperar hasta que el hardware 3D haya terminado de dibujar por completo antes de que pueda ingresar los píxeles directamente en el búfer de cuadros. Hasta que el software haya terminado de hacer eso, el hardware está inactivo.
Los mapas de bits y los cuadros de imagen se deben alinear paralelos a los bordes de la pantalla, por lo que el texto girado no es posible.
No es posible escalar mapas de bits y Drawpixels.
Hay una ventaja significativa para las fuentes Raster, y es que en las implementaciones OpenGL solo de software, es probable que sean MÁS RÁPIDAS que los otros enfoques ... al revés de la situación en el hardware 3D.

Fuentes geométricas. Dibuja los caracteres de la fuente usando primitivas geométricas: líneas, triángulos, lo que sea. Las desventajas de esto son:
El número de triángulos que se necesitan para dibujar algunos caracteres puede ser muy grande, especialmente si desea que se vean bien. Esto puede ser malo para el rendimiento.
Diseñar fuentes es difícil y costoso.
Hacer fuentes con bordes de colores, sombras, etc. exacerba significativamente los otros dos problemas.

Las ventajas son: Las fuentes geométricas se pueden escalar, rotar, retorcer, transformar, extruir.
Puede utilizar modelos de iluminación sofisticados, mapeo de entorno, texturizado, etc.
Si se utiliza en un mundo 3D, se puede detectar una colisión con ellos.
Las fuentes geométricas escalan muy bien. No exhiben artefactos mal aliasing y no se vuelven "borrosos" a medida que se agrandan.

Texture-Mapped Fonts. Típicamente, toda la fuente se almacena en una o dos grandes mapas de textura y cada letra se dibuja como un único cuadrilátero. Las desventajas son:
El tamaño del mapa de texturas que necesita puede ser bastante grande, especialmente si necesita mayúsculas y minúsculas, y/o si desea que la fuente se vea bien en tamaños de puntos grandes. Esto es especialmente un problema en el hardware que solo admite tamaños de mapa de textura limitados (por ejemplo, 3Dfx Voodoo solo puede representar mapas de hasta 256x256)
Si utiliza el mapeo MIP, al escalar la fuente se ve un poco borroso. Si no usa MIPmapping, se verá horriblemente aliasy.

Las ventajas son:
Generalidad: puede utilizar una imagen arbitary a todo color para cada letra de la fuente. Las fuentes de textura se pueden rotar y ampliar, aunque siempre se ven "planas".
Es fácil convertir otros tipos de fuentes en mapas de texturas.
se puede dibujar en la escena 3D y ellos serán iluminados correctamente.
¡VELOCIDAD! Las fuentes texturizadas requieren que se envíe un solo cuadrilátero al hardware para cada letra. Es probable que sea un orden de magnitud más rápido que las fuentes de trama o geométricas. Dado que el hardware 3D de gama baja está altamente optimizado para dibujar polígonos texturizados simples, la velocidad también se mejora porque usted está 'en la ruta rápida' a través del renderizador. (Advertencia: En sólo software, fuentes de textura de OpenGL será lento

Enlaces a algunas bibliotecas libres de fuentes:.

+2

Has hecho un buen trabajo al resumir las trampas con las que se va a encontrar el shuttle87. Tengo la sensación de que no aprecian los dolores de cabeza que están pidiendo. – drewish

1

Te recomiendo que QT sea la base de KDE o GTk + para GNOME. Ambos tienen soporte para OPENGL y texto. Con QT puede hacer gráficos avanzados (QGraphicsView), incluida la animación ... Eche un vistazo a la aplicación de demostración QT.

Cuestiones relacionadas