2012-08-01 25 views
12

Estoy usando PowerVR OpenGL ES 2 SDK para desarrollar mi juego en Windows con C++, entonces puedo portarlo a android o iphone.La forma correcta de dibujar texto en OpenGL ES 2

Todo se ve bien, pero ahora estoy atascado con la representación de texto. No puedo encontrar ningún tutorial detallado sobre la representación de texto (utilizando fuente TTF o Bitmap) en OpenGL ES 2.0 utilizando C++. Encontré muchos temas sobre cómo renderizar texto en android o iphone usando java o object-c (con textview, surfaceview o blah blah) pero no creo que eso sea lo que necesito. Necesito una "solución multiplataforma". (O puede ser que estoy equivocado en este punto?)

Después de investigar un poco, tengo la solución en mi mente:

cargar y enlazar Fuente mapa de bits de textura ->texto analizar y generar y se unen vértices matriz, mapeo de textura con arreglo ultravioleta, ... -> Render a pantalla

no estoy probado todavía, pero creo que es un problema cuando se utiliza mi solución: cuando quiero cambiar el texto (por ejemplo: estoy haciendo una puntuación de usuario, o un temporizador en la pantalla) Debo volver a vincular la matriz de vértices y matriz UV, no es una buena idea, ¿verdad?

¿Hay alguna forma mejor/forma correcta de dibujar la fuente de mapa de bits en la pantalla con OpenGL ES 2?

Respuesta

2

El procesamiento de texto es uno de los temas que los recién llegados deben enfrentar tarde o temprano en el mundo de las bibliotecas 3D.

Hay muchos tutoriales en Internet sobre la representación de texto, muchos libros hablan de ello. Mi consejo es mirar a su alrededor y tratar de entender cómo funcionan.

Las fuentes TTF no son una solución viable ya que, en un escenario de computación en tiempo real (como un juego de computadora), la técnica de TTF basada en la geometría consume demasiados recursos.

Una solución muy común (la que uso en mi motor PATRIA 3D por ejemplo) es usar un atlas de textura que contiene el glifo de los diferentes caracteres, entonces la lógica de la aplicación necesita manejar el texto -> relación de posición del glifo para la textura de los quads que componen su "texto en pantalla" final.

renderizado de texto no es un tema sencillo, ya que se trata de temas como el ajuste entre caracteres/separación/texto de diferentes tamaños, etc.

tratar de seguir este enlace para entender mejor el tema (si no estoy equivocado, el autor de este wiki es un miembro activo de esta misma comunidad).

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

4

La solución que se menciona es el camino a seguir, y de hecho, si modifica su texto, que tendrá que volver a crear la geometría que lo representa, y volver a enviarlo a OpenGL.

Este paso de recreación tomará algún tiempo, pero seguramente no excesivamente.

para la representación de texto, el problema tiene dos componentes principales:

  • crear la textura de su atlas de mapa de bits
  • dibujar el texto usando esta textura, teniendo en cuenta las medidas de fuente (tamaño, perfil fuera de línea, etc.) Y, posiblemente, el antialiasing de subpíxeles

Para crear su atlas de textura, se puede encontrar algo de código alrededor (probablemente utilizando freetype) o utilizar una herramienta existente (como AngleCode's bmfont).

Para dibujar, es probable que desee desplegar su propio código, basado en algún código existente, ya que hay muchos detalles para corregir el texto. Para comenzar su dolor de cabeza, puede echar un vistazo al this article.

Una buena fuente moderna de inspiración podría ser el código Nicolas Rougier's freetype-gl.

+0

¿Alguien tiene un ejemplo de Android OpenGL ES 2.0 que admite la rotación? – Burf2000

0

La forma correcta para dibujar texto en un juego es el uso de los atlas de textura con glifos que contienen campos de distancia: https://www.mapbox.com/blog/text-signed-distance-fields/

También vea este documento Siggraph de Valve (los creadores de Half-Life y Portal) que describen las variaciones de la técnica: http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

La calidad del texto basado en campo de distancia es mucho mayor que el texto basado en mapas de bits. También utiliza menos memoria porque el campo de distancia es más pequeño que la representación literal de la fuente de mapa de bits.

Cuestiones relacionadas