Necesito una forma de dibujar texto independiente de resolución en mi juego. Es decir, necesito poder acercarme al texto y nunca ver los artefactos de píxeles.
¿Alguien puede hacer alguna sugerencia sobre cómo podría hacerlo?
Supongo que necesitaría buscar métodos de fuentes basadas en vectores, en lugar de fuentes rasterizadas, lo que podría ser un punto de partida. No soy un experto en el tema, así que dejaré que alguien que sepa responder.
Ray Dey
Respuestas:
7
Hay tres formas comunes de hacerlo. En realidad, no se trata de eliminar por completo los artefactos, lo cual es imposible, a menos que tenga memoria o tiempo de procesador ilimitados, sino más bien cómo minimizarlos de una manera que se ajuste a su código existente y plataformas de destino.
Primero, solo use su rasterizador de fuente, generalmente FreeType, para rasterizar la fuente en el tamaño que desee al hacer zoom. Esto se verá genial en las capturas de pantalla, pero es increíblemente lento. Puede resolver la lentitud almacenando en caché los tamaños, pero luego se vuelve increíblemente hambriento de memoria. Tampoco se ve muy bien en movimiento, porque hacer que los glifos se vean bien para la visualización estática requiere escalarlos de manera no uniforme. Aún así, es una opción si está en una plataforma con suficiente memoria (como una PC) y sus escalas están limitadas a un rango pequeño, como 10px a 30px. Este método tampoco admite muchos dulces visuales por sí mismo.
En segundo lugar, puede almacenar su texto como una malla. Existen algunas bibliotecas para hacer esto, como GLTT , o podría escribir la suya propia. Ahora ya no tiene artefactos de píxeles, pero tendrá artefactos poligonales si se acerca mucho, como cualquier otra malla en un juego 3D. El texto de malla admite una gran cantidad de dulces visuales ya que se pueden aplicar sombreadores de vértices y la malla se puede intercalar con cualquier otro dibujo del mundo que haga. Es razonablemente ligero en memoria y CPU, y es fácil de medir el costo ya que es solo una malla estándar. Integrar en una canalización de renderizado 2D basada en sprites normal puede ser una molestia.
En tercer lugar, puede usar campos de distancia en combinación con un sombreador de píxeles . Esta es una técnica relativamente nueva que actualmente es popular, usando un sombreador simple para muestrear una textura prefabricada y el filtrado bilineal "libre" en su tarjeta de video para escalar glifos limpiamente. Utiliza poca memoria fácil de predecir en comparación con otros métodos: una textura de 0.5MB a 1MB por juego de caracteres por fuente. Se adapta perfectamente a las canalizaciones de representación basadas en sprites porque está basado en sprites; cada glifo sigue siendo un quad con textura. Produce artefactos de píxeles, pero muy pocos en comparación con otros métodos que escalan texturas. También hay una reserva de función fija si los sombreadores de píxeles no están disponibles, pero el texto termina con un alias. Debido a que el muestreo se realiza en un sombreador de píxeles, admite algunos dulces visuales, como delinear y sombrear, a bajo precio.
También hay un artículo de investigación de Microsoft Research de Loop y Blinn, sobre la representación de curvas independientes de resolución utilizando sombreadores. Sugiere usar la técnica presentada para representar el texto TrueType de manera independiente de la resolución.
Tendrá que construir sus caracteres de fuente a partir de una combinación de curvas y líneas, que luego convertirá a geometría con un nivel de detalle adecuado en tiempo de ejecución.
Afortunadamente, la mayoría de las fuentes ya están construidas a partir de curvas bezier. Para obtener los datos de la curva, solo necesita usar la función estándar de Windows GetGlyphOutline () para extraerlos.
No estoy seguro de si puede obtener los datos de esa curva de C # sin PInvoke.
Para hacer esta plataforma cruzada y no preocuparse por las cosas de PInvoke, me parece que podría escribir una herramienta para volcar los datos que GetGlyphOutline lee (vea esta pregunta SO ) en algún formato personalizado, y luego tener algún archivo simple de E / S en el código del juego para cargar sus datos de glifos almacenados personalizados.
Ricket
0
Es posible que desee echar un vistazo a freetype. No tengo idea de si está disponible en su plataforma o si la licencia es aplicable, pero es una biblioteca de código abierto bastante excelente para representar fuentes de tipo verdadero y otras fuentes vectoriales. Creo que tuvieron que hacer un código inteligente de evasión de abogados para que las fuentes se representaran de una manera estéticamente agradable. La verdadera forma de tipo implica códigos de bytes en las curvas para proporcionar pistas al renderizador para que las características de fuente importantes (como verticales y serifs) no se borren como lo harían con el suavizado ingenuo estándar. Esa técnica tiene una patente, por lo que la gente de tipo libre tuvo que idear algo más que hiciera el trabajo y no invocara a la terrible bestia abogada de (creo) Apple. De todos modos, dejando a un lado la programación legal, intente buscar el tipo librehttp://freetype.sourceforge.net/index2.html
Respuestas:
Hay tres formas comunes de hacerlo. En realidad, no se trata de eliminar por completo los artefactos, lo cual es imposible, a menos que tenga memoria o tiempo de procesador ilimitados, sino más bien cómo minimizarlos de una manera que se ajuste a su código existente y plataformas de destino.
Primero, solo use su rasterizador de fuente, generalmente FreeType, para rasterizar la fuente en el tamaño que desee al hacer zoom. Esto se verá genial en las capturas de pantalla, pero es increíblemente lento. Puede resolver la lentitud almacenando en caché los tamaños, pero luego se vuelve increíblemente hambriento de memoria. Tampoco se ve muy bien en movimiento, porque hacer que los glifos se vean bien para la visualización estática requiere escalarlos de manera no uniforme. Aún así, es una opción si está en una plataforma con suficiente memoria (como una PC) y sus escalas están limitadas a un rango pequeño, como 10px a 30px. Este método tampoco admite muchos dulces visuales por sí mismo.
En segundo lugar, puede almacenar su texto como una malla. Existen algunas bibliotecas para hacer esto, como GLTT , o podría escribir la suya propia. Ahora ya no tiene artefactos de píxeles, pero tendrá artefactos poligonales si se acerca mucho, como cualquier otra malla en un juego 3D. El texto de malla admite una gran cantidad de dulces visuales ya que se pueden aplicar sombreadores de vértices y la malla se puede intercalar con cualquier otro dibujo del mundo que haga. Es razonablemente ligero en memoria y CPU, y es fácil de medir el costo ya que es solo una malla estándar. Integrar en una canalización de renderizado 2D basada en sprites normal puede ser una molestia.
En tercer lugar, puede usar campos de distancia en combinación con un sombreador de píxeles . Esta es una técnica relativamente nueva que actualmente es popular, usando un sombreador simple para muestrear una textura prefabricada y el filtrado bilineal "libre" en su tarjeta de video para escalar glifos limpiamente. Utiliza poca memoria fácil de predecir en comparación con otros métodos: una textura de 0.5MB a 1MB por juego de caracteres por fuente. Se adapta perfectamente a las canalizaciones de representación basadas en sprites porque está basado en sprites; cada glifo sigue siendo un quad con textura. Produce artefactos de píxeles, pero muy pocos en comparación con otros métodos que escalan texturas. También hay una reserva de función fija si los sombreadores de píxeles no están disponibles, pero el texto termina con un alias. Debido a que el muestreo se realiza en un sombreador de píxeles, admite algunos dulces visuales, como delinear y sombrear, a bajo precio.
fuente
También hay un artículo de investigación de Microsoft Research de Loop y Blinn, sobre la representación de curvas independientes de resolución utilizando sombreadores. Sugiere usar la técnica presentada para representar el texto TrueType de manera independiente de la resolución.
fuente
Tendrá que construir sus caracteres de fuente a partir de una combinación de curvas y líneas, que luego convertirá a geometría con un nivel de detalle adecuado en tiempo de ejecución.
Afortunadamente, la mayoría de las fuentes ya están construidas a partir de curvas bezier. Para obtener los datos de la curva, solo necesita usar la función estándar de Windows GetGlyphOutline () para extraerlos.
No estoy seguro de si puede obtener los datos de esa curva de C # sin PInvoke.
fuente
Es posible que desee echar un vistazo a freetype. No tengo idea de si está disponible en su plataforma o si la licencia es aplicable, pero es una biblioteca de código abierto bastante excelente para representar fuentes de tipo verdadero y otras fuentes vectoriales. Creo que tuvieron que hacer un código inteligente de evasión de abogados para que las fuentes se representaran de una manera estéticamente agradable. La verdadera forma de tipo implica códigos de bytes en las curvas para proporcionar pistas al renderizador para que las características de fuente importantes (como verticales y serifs) no se borren como lo harían con el suavizado ingenuo estándar. Esa técnica tiene una patente, por lo que la gente de tipo libre tuvo que idear algo más que hiciera el trabajo y no invocara a la terrible bestia abogada de (creo) Apple. De todos modos, dejando a un lado la programación legal, intente buscar el tipo librehttp://freetype.sourceforge.net/index2.html
fuente