Actualmente estoy desarrollando un pequeño juego OpenGL para la plataforma Android y me pregunto si hay una manera fácil de renderizar texto sobre el marco renderizado (como un HUD con la puntuación del jugador, etc.). El texto también necesitaría usar una fuente personalizada.
He visto un ejemplo usando una Vista como superposición, pero no sé si quiero hacerlo, ya que es posible que desee trasladar el juego a otras plataformas más adelante.
¿Algunas ideas?
android
opengl-es
text-rendering
shakazed
fuente
fuente
Respuestas:
El SDK de Android no viene con ninguna forma fácil de dibujar texto en vistas OpenGL. Dejándote con las siguientes opciones.
fuente
La representación del texto en una textura es más simple de lo que parece la demostración de Sprite Text, la idea básica es usar la clase Canvas para representar en un mapa de bits y luego pasar el mapa de bits a una textura OpenGL:
fuente
He escrito un tutorial que amplía la respuesta publicada por JVitela. . Básicamente, utiliza la misma idea, pero en lugar de representar cada cadena en una textura, renderiza todos los caracteres de un archivo de fuente a una textura y la utiliza para permitir la representación de texto dinámico completo sin más ralentizaciones (una vez que se completa la inicialización) .
La principal ventaja de mi método, en comparación con los diversos generadores de atlas de fuentes, es que puede enviar archivos de fuentes pequeñas (.ttf .otf) con su proyecto en lugar de tener que enviar mapas de bits grandes para cada variación y tamaño de fuente. Puede generar fuentes de calidad perfecta en cualquier resolución usando solo un archivo de fuente :)
El tutorial incluye código completo que se puede usar en cualquier proyecto :)
fuente
Según este enlace:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Puede representar cualquier vista en un mapa de bits. Probablemente valga la pena suponer que puede diseñar una vista según lo requiera (incluyendo texto, imágenes, etc.) y luego representarla en un mapa de bits.
Usando el código de JVitela anterior , debería poder usar ese mapa de bits como una textura OpenGL.
fuente
Eche un vistazo a CBFG y al puerto de Android del código de carga / representación. Debería poder colocar el código en su proyecto y usarlo de inmediato.
CBFG - http://www.codehead.co.uk/cbfg
Cargador de Android: http://www.codehead.co.uk/cbfg/TexFont.java
fuente
Miré el ejemplo del texto de sprite y parece terriblemente complicado para tal tarea, también consideré renderizar a una textura, pero estoy preocupado por el impacto en el rendimiento que podría causar. En su lugar, podría tener que ir con una vista y preocuparme por la transferencia cuando sea el momento de cruzar ese puente :)
fuente
Mire la muestra de "Texto de Sprite" en las muestras de GLSurfaceView .
fuente
En mi humilde opinión, hay tres razones para usar OpenGL ES en un juego:
Dibujar texto siempre es un problema en el diseño del juego, porque estás dibujando cosas, por lo que no puedes tener la apariencia de una actividad común, con widgets, etc.
Puede usar un marco para generar fuentes de mapa de bits a partir de fuentes TrueType y representarlas. Todos los marcos que he visto funcionan de la misma manera: generan las coordenadas de vértice y textura para el texto en tiempo de dibujo. Este no es el uso más eficiente de OpenGL.
La mejor manera es asignar memorias intermedias remotas (objetos de memoria intermedia de vértices - VBO) para los vértices y texturas al principio del código, evitando las operaciones de transferencia de memoria diferida en tiempo de extracción.
Ten en cuenta que a los jugadores no les gusta leer texto, por lo que no escribirás un texto largo generado dinámicamente. Para las etiquetas, puede usar texturas estáticas, dejando texto dinámico para tiempo y puntaje, y ambos son numéricos con algunos caracteres de longitud.
Entonces, mi solución es simple:
Las operaciones de dibujo son rápidas, si usa buffers estáticos remotos.
Creo un archivo XML con posiciones de pantalla (basado en el porcentaje diagonal de la pantalla) y texturas (estática y caracteres), y luego cargo este XML antes de renderizar.
Para obtener una alta tasa de FPS, debe evitar generar VBO en el momento del sorteo.
fuente
Si insiste en usar GL, puede representar el texto en texturas. Suponiendo que la mayor parte del HUD es relativamente estático, no debería tener que cargar las texturas para texturizar la memoria con demasiada frecuencia.
fuente
Eche un vistazo
CBFG
y el puerto de Android del código de carga / representación. Debería poder colocar el código en su proyecto y usarlo de inmediato.CBFG
Cargador de Android
Tengo problemas con esta implementación. Muestra solo un carácter, cuando intento cambiar el tamaño del mapa de bits de la fuente (necesito letras especiales) falla todo el dibujo :(
fuente
He estado buscando esto durante unas horas, este fue el primer artículo que encontré y, aunque tiene la mejor respuesta, creo que las respuestas más populares están fuera de lugar. Ciertamente para lo que necesitaba. Las respuestas de Weichsel y Shakazed estaban en el botón, pero un poco oscurecidas en los artículos. Para ponerte derecho al proyecto. Aquí: solo cree un nuevo proyecto de Android basado en una muestra existente. Elija ApiDemos:
Mira debajo de la carpeta de origen
ApiDemos/src/com/example/android/apis/graphics/spritetext
Y encontrarás todo lo que necesitas.
fuente
Para texto estático :
Para textos largos que deben actualizarse de vez en cuando:
Para un número (formateado 00.0):
En su evento onDraw, solo actualice la variable de valor enviada al sombreador.
El código anterior funciona para un atlas de texturas donde los números comienzan desde 0 en la séptima columna de la segunda fila del atlas de fuentes (textura).
Consulte https://www.shadertoy.com/view/Xl23Dw para la demostración (aunque con una textura incorrecta)
fuente
En OpenGL ES 2.0 / 3.0 también puede combinar OGL View y elementos UI de Android:
Crear diseño activity_gl.xml:
Para actualizar elementos del hilo de renderizado, puede usar Handler / Looper.
fuente