c++ - Métodos de representación de texto OpenGL y compensaciones
freetype 2.4 3 (3)
Fondo
Trabajo en el juego Bitfighter . Seguimos siendo compatibles con OpenGL 1.1 y compilamos para OSX, Windows y Linux.
Usamos gráficos vectoriales para todo , incluida la representación y manipulación de texto. Usamos una variación ligeramente modificada de ''FontStrokeRoman'' de GLUT, que es solo un montón de líneas estáticas. Nos gusta esto, ya que parece funcionar muy bien, es fácil de rotar / escalar / manipular. También permitimos el chat en el juego para que el texto se dibuje sobre la marcha.
Problema
Queremos usar más / diferentes fuentes.
Hemos encontrado varias otras fuentes que nos gustan, pero todas ellas son fuentes de tipo TTF que se construyen como polígonos (con curvas, etc.) en lugar de trazos o espinas. Esto trae algunos problemas:
- Tendríamos que usar texturas (que hemos evitado hasta ahora en el juego)
- No son fácilmente redimensionables / giratorios / etc.
- El rendimiento es significativamente menor (teóricamente?)
Hemos experimentado con la conversión de fuentes TTF a matrices de puntos de polígono y luego triangular el relleno. Sin embargo, esto ha sido difícil de renderizar bien: la alusión a píxeles / anti-aliasing parece difícil de hacer en este caso.
Incluso hemos experimentado con esqueletizar las fuentes de polígono utilizando bibliotecas como ''campskeleton'', por lo que podemos generar una fuente vectorial-stroke (sin mucho éxito que se vea bien).
¿Qué debemos hacer?
Sé que esta pregunta es algo general. Queremos mantener las capacidades de manipulación de texto y rendimiento pero poder utilizar mejores fuentes. Estoy abierto a cualquier sugerencia en cualquier dirección.
Algunas soluciones podrían ser respuestas a lo siguiente:
- ¿Cómo protegemos adecuadamente el texto basado en polígonos y seguimos manteniendo el rendimiento?
- ¿Las texturas realmente funcionan peor que las matrices de puntos estáticos? Tal vez tengo una suposición defectuosa
- ¿Se puede redimensionar / rotar las fuentes texturizadas de manera rápida?
- ¿Algo completamente diferente?
¿Intentó describir la descomposición de glifos usando el Fet_Outline_Decompose de Fetype ? Freetype es la herramienta de elección para la representación de fuentes y la extracción de contornos de glifos. Hinting es compatible y los modos de renderización le permiten especificar que desea antializar, hacer alusión, objetivos monocromáticos, etc.
Freetype también tiene incorporado un mecanismo de caché de glifos / mapas de bits que puede ser útil.
Nota: OGFLT parece cerrar la brecha entre freetype y opengl aunque nunca tuve la oportunidad de usarlo
Luego de convencer (gracias a Serge) y probar varias de las sugerencias aquí (incluyendo FTGL que usa el tipo de freetype), nos hemos decidido por:
Font-Stash que usa stb_truetype
Esto parecía perfecto para nuestro juego. El rendimiento de representación fue comparable a la fuente de trazos basada en vectores que utilizamos: los cuadros con textura realmente no son tan lentos, una vez que se generan, y el almacenamiento en caché de Font-Stash ayuda inmensamente. Además, el uso de stb_truetype nos permitió no requerir otra dependencia en el juego en todas las plataformas.
Por lo que vale, esta solución fue aproximadamente un orden de magnitud más rápida que el uso de FTGL para fuentes de tipo verdadero, probablemente debido al almacenamiento en caché.
Gracias por las sugerencias y sugerencias.
No soy un experto en OpenGL ni un experto gráfico en general. Y, realmente, Raptor, yo -hate- ser el tipo que dice esto, porque sé cómo te sientes ahora.
Realmente odio decirlo, pero honestamente, solo les daría una oportunidad a las fuentes TTF, usando sus texturas y polígonos como estaban destinados. Dudo que ese uso realmente sea perjudicial para su desempeño en estos días. Probablemente sería más valioso ahorrar tiempo para usarlos tal como están, en lugar de perder tiempo para experimentar una solución inteligente que se ajuste más a tus deseos.
Dudo que el dibujo de texto usando polígonos / texturas sea perjudicial para usted. Esto se aplica especialmente para las computadoras de hoy. ¿Cuántos años atrás, tecnológicamente, tiene la intención de apoyar con su aplicación? ¿O quizás deseas ejecutarlo también en el Raspberry PI? ¿O otras plataformas móviles que no tienen altas capacidades gráficas? El apoyo de cualquiera de estos podría, tal vez, invalidar mis reclamos.
Pero, como dije, realmente odio ser el tipo que sugiere que sigas adelante como está. Porque he estado allí, pidiendo consejo sobre el rendimiento (a veces incluso sobre cosas más pequeñas) y solo gimiendo cuando alguien dice ''olvídalo, el compilador lo manejará'' o ''las computadoras están tan avanzadas que no deberías preocuparte''. . Sinceramente, espero que alguien más entre con experiencia y una buena respuesta para ti. Sin embargo, si no, solo quiero que sepas: no puedo prever la posibilidad de que usar TTF, como se pretendía, sería perjudicial para tu rendimiento en el juego.