2010-03-15 18 views
7

Tengo que extender un sistema OpenGL-Rendering para admitir caracteres internacionales (especialmente hebreo, árabe y cirílico).Multilingüe Unicode en OpenGL

plataforma de desarrollo es Windows (XP | Vista | 7), por desgracia usando Embercardero Delphi 2010.

Actualmente uso wglOutLineFont (...) para construir la lista de visualización de mi fuente y glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text)) para hacer mis cuerdas.

Si bien esto es factible para caracteres latinos 1, construir el juego completo de caracteres Unicode por adelantado consume mucho tiempo (unos 8,5 minutos en mi máquina), por lo que estoy buscando una solución más eficiente. Pensé en limitar el rango de u + 0020 - u + 077f (latín, griego, cirílico, árabe y hebreo) para incluir solo los glifos que necesito, pero eso sería solo una solución para mis necesidades actuales, y será insuficiente una vez otra codificación es necesaria.

Por el lado positivo, no tengo que preocuparme por la dirección de izquierda a derecha o de izquierda a derecha ya que nuestra aplicación ya lo puede manejar.

Supongo que este es un problema bien conocido, por lo que me gustaría preguntar si hay algún material de referencia sobre esto en la web, o si podría compartir algo de información sobre esto?

Editar A aclaración: Uso representaciones de fuentes poligonales. Cada fuente se construye en el tamaño de la unidad (1.0) por adelantado y se escala apropiadamente usando glScalef(...) antes de la representación. Decidí no rastrillar previamente, ya que los usuarios podrían acercarse bastante (la aplicación se usa para CAD), por lo que los artefactos de barrido se volverían visibles.

Además, dado que una escena rara vez supera más de unos pocos cientos de caracteres (principalmente etiquetas y medidas), la ganancia de velocidad de la rasterización previa es despreciable.

Respuesta

3

No pre-compile las listas de visualización: - cree un sprite intermedio que cree las listas bajo demanda y las almacene en caché. No es práctico intentar calcular listas previamente o generar texturas rasterizadas previamente en cada tamaño de fuente, cara de fuente y para todos los caracteres, especialmente cuando se escala a conjuntos de caracteres lejanos.

+0

¡Usar objetos de búfer de vértice sería muy agradable!Los rásteres de fuente pueden estar en alta resolución, luego mipmaps y multisampling hacen el resto. – Luca

+0

¿Quiere decir que debería generar las listas una vez que sepa qué caracteres necesitaré dibujar para una cadena determinada? – sum1stolemyname

+0

Sí. Enfrentando un problema similar, y usando la biblioteca OpenType (para la idependencia de la plataforma en lugar de wgl) fuimos con la representación de texturas rasterizadas que contienen renders de palabras. Luego guardamos en caché las palabras visibles, y desechamos cualquier palabra que haya sido desplazada de la pantalla. Nuestra aplicación solo muestra una pequeña cantidad de texto, sin requisitos de formateo muy complicados, pero hay suficiente texto potencial que la preprocesamiento de todo ello podría ocasionar retrasos visibles. –

1

He tenido la suerte de transcribir this tutorial en C++, aunque no estoy seguro de qué tan bien se transferirá a Delphi.

2

Debe reemplazar el wglOutLineFont.

Para hacerlo, genere/renderice para texturizar los glifos necesarios utilizando wglOutLineFont y guarde la textura en un archivo de imagen ráster. Una vez que la aplicación se carga, necesita cargar la imagen de textura y las coordenadas de textura del glifo (4 coordenadas para cada glifo) y generar las listas de visualización (una lista para cada glifo, cada lista de visualización dibujará un solo glifo como cuadrícula texturizada).

Cada corto que representa un glifo debe tener una lista de visualización correspondiente (su valor coincide mucho, y glListBase puede ayudar en esto).

Supongo que cargar una textura es más rápido que generar listas de visualización de fuentes en tiempo de ejecución. Prácticamente se mueve fuera de línea el cálculo del ráster del glifo. Pero la generación de la lista de visualización puede ser pesada (muchos glifos). De hecho, puede ejecutar en un hilo separado la generación de la lista de visualización o generar solo las listas de visualización requeridas según sus necesidades.