Forma preferida de renderizar texto en OpenGL [cerrado]

17

Estoy a punto de recoger gráficos por computadora una vez más para un proyecto universitario. Para un proyecto anterior, utilicé una biblioteca llamada FTGL que no me dejó bastante satisfecho, ya que se sentía bastante pesado (probé muchas técnicas de renderizado, el renderizado de texto no escalaba muy bien).

Mi pregunta es, ¿hay una biblioteca buena y eficiente para esto? Si no, ¿cuál sería la forma de implementar un texto rápido pero atractivo? Algunos usos previstos son:

  • Etiquetas de objeto / personaje flotante
  • Diálogos
  • Los menús
  • HUD

EDITAR: Preferiblemente también podría cargar fuentes

dukeofgaming
fuente
1
Esta es una pregunta sobre "qué tecnología usar" y, por lo tanto, probablemente debería cerrarse.
Laurent Couvidou

Respuestas:

4

Un marco popular es la GUI de Crazy Eddie .

Pero si bien eso es atractivo, no es inusual rodar el tuyo (y tal vez lamentarte a medida que el alcance aumenta más adelante).

Es normal tener sus glifos en mapas de bits y luego dibujarlos utilizando OpenGL.

A veces, muestra texto transitorio que solo puede aparecer para un puñado de cuadros. Solo usando GL_QUADS + glVertex será suficiente. Pero para cualquier gran cantidad de texto o cualquier visibilidad de larga duración, vale la pena poner el GL_QUADS en un VBO: he notado grandes mejoras en el rendimiento de esto.

Por supuesto, está la cuestión de generar los glifos reales que necesita. Hay programas como bmfont que puedes usar para eso. O puede que necesite una representación bastante más complicada, por ejemplo, tipo libre bajo demanda. He estado usando bmfont con mi propio procesador bastante felizmente, es muy fácil de deducir.

Será
fuente
9

Hay muchas maneras, dependiendo de lo que quieras ... Como en todos los demás, no hay algo como "la mejor solución". ¿Qué plataforma es tu objetivo? ¿Qué idioma estás usando? ¿Qué es el cambio de tamaño / rotación del texto? ¿Es necesario? ¿Necesita poder renderizar TrueTypeFonts? ¿Qué hay de multilenguaje / Unicode? ¿Cómo desea almacenar su texto (qué codificación, etc.)?

En el pasado también utilicé FTGL, así como el tipo libre puro (http://www.freetype.org/ FTGL se basa en esto), diferentes tipos de fuentes de mapa de bits, fuentes de contorno ... Ahora soy mayormente adicto al mapa de bits fuentes, pero esa es solo mi preferencia personal. Porque ya no quiero tratar con diferentes charsets, codificaciones y cosas así, y la licencia para bitmapfonts también es más fácil y más barata que para TrueTypeFonts. Y es utilizable en todas las plataformas que pueden cargar imágenes. Simplemente uso un quad en openGL y mapeo una parte de mi textura en él. El otro lado es: la fuente solo será redimensionable en un factor de aproximadamente +/- 50%. Si puede vivir con eso, sugeriría usar una fuente de mapa de bits.

Si también tiene que lidiar con diferentes codificaciones / charsets, debe encontrar una manera de cargar y usar TrueTypeFonts (como con freetype, usando otra biblioteca o con su propia implementación) ...

También eche un vistazo a los diferentes tutoriales sobre este tema:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Fuentes de mapa de bits

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Fuentes de esquema

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Fuentes de contorno mapeadas

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Fuente de textura 2D

¡Buena suerte!

Constantin
fuente
+1 Gracias por la valiosa información sobre rendimiento, conocía los tutoriales de NeHe. Creo que usé fuentes de mapa de bits ... pero no se escalaron: alrededor de 60 etiquetas flotando en una escena sobre esferas unidas por líneas, ¿alguna idea de eso? (Estaba pensando que debería haber buscado una manera de implementar un patrón de peso mosca)
dukeofgaming
1
Precaución: los tutoriales de NeHe son para la tubería de función fija anterior y no se actualizan con frecuencia. Si está buscando una solución moderna de OpenGL, consulte stackoverflow.com/questions/5262951/…
brita_
6

Si desea utilizar fuentes de mapa de bits, no puede equivocarse con el generador de fuentes de mapa de bits Angelcode: http://www.angelcode.com/products/bmfont/

Convierte una fuente TrueType en una o más texturas (con glifos bien empaquetados) y genera un pequeño archivo que contiene los UV y los espacios (encuentro que la salida XML es particularmente fácil de trabajar, y la calidad de los datos de espaciado es generalmente muy bueno, incluso sin kerning verdadero)

bluescrn
fuente
1

Estoy usando las bibliotecas de Sean Barret para renderizar truetype-glyphs en OpenGL (stb_image, stb_truetype).

El proyecto Recast / Detour está utilizando estas bibliotecas para crear una interfaz de usuario ( IMUI )

Marco Schmidt
fuente
0

Considerar QML . Es una biblioteca de interfaz de usuario completamente funcional con una sintaxis fácil de usar. Su conjunto de características es significativamente mejor que CEGUI en mi experiencia, y tiene una mejor documentación, soporte y comunidad ya que su objetivo principal son las aplicaciones de escritorio y la capacidad de renderizar fuera de la pantalla es una especie de bono.

Pros:

  • Utiliza OpenGL en el back-end para todo el renderizado.
  • Puede cargar cualquier fuente disponible para el sistema host y también puede analizar fuentes adicionales que incluya como recursos
  • Utiliza la representación de texto de campo de distancia con signo para una salida eficiente y de alta calidad
  • Se puede procesar directamente en una textura OpenGL, por lo que puede colocar los resultados en su entorno de juego fácilmente
  • Qt tiene muchos enlaces de idiomas

Contras:

  • Qt es un gran marco
  • El uso de QML en proyectos Direct3D o Vulkan requiere saltar a través de los aros para obtener la textura GL en la API apropiada (o esperar a que alguien escriba renderizadores nativos D3D / Vulkan para QML)
  • Todavía hay algunas peculiaridades menores en QML donde intentará usar un control nativo incluso si está renderizando en una superficie fuera de la pantalla, como cuando intenta abrir un menú desplegable para un elemento de la lista.
Jherico
fuente