7
votes

Rendu unicode multilingue à OpenGL

Je dois prolonger un système de rendu opengl pour soutenir les personnages internationaux (en particulier l'hébreu, l'arabe et le cyrillique).

La plate-forme de développement est Windows (XP | Vista | 7), Hélas utilisant Embercardero Delphi 2010.

J'utilise actuellement wgloutlinefont (...) pour construire la liste d'affichage de ma police et GLCallLists (longueur (m_text), non signé_short, pwchar (m_text)) pour rendre mes cordes.

Bien que cela soit réalisable pour les caractères latin-1, la construction du jeu de caractères Unicode complet à l'avance est assez fastidieuse (environ 8,5 minutes sur ma machine), je suis donc à la recherche d'une solution plus efficace. J'ai pensé à limiter la gamme de U + 0020 - U + 077F (latin, grec, grec, cyrillique, arabe et hébreu) ​​pour inclure les glyphes dont j'ai besoin, mais ce serait une solution pour mes besoins actuels et deviendra insuffisante une fois que autre codage est nécessaire.

À la hausse, je n'ai pas à vous soucier de la direction gauche-à droite ou de droite, car notre application peut déjà gérer cela.

Je m'attendrais à ce que cela soit un problème bien connu, je voudrais donc demander s'il y a du matériel de référence à ce sujet sur le Web, ou si vous pouviez partager des informations sur cela?

edit Une clarification: j'utilise une représentation polygonale de police. Chaque police est construite à l'avance (1.0) à l'avance et à l'échelle de manière appropriée en utilisant GLSCALEF (...) avant de rendu. J'ai décidé de pré-raster, car les utilisateurs peuvent zoomer assez étroitement (l'application est utilisée pour la CAD), donc les artefacts de rastering deviendront visibles.

En outre, étant donné qu'une scène dépasse rarement plus de quelques centaines de caractères (principalement des étiquettes et des mesures), le gain de vitesse de la pré-rasterisation est négligeable.


0 commentaires

3 Réponses :


1
votes

J'ai eu la chance de translittération ce tutoriel dans c ++, bien que je Je ne sais pas à quel point il va transférer à Delphi.


0 commentaires

2
votes

Vous devez remplacer le wgloutlinefont .

Pour ce faire, générer / rendu pour texturer les glyphes requis à l'aide de wgloutlinefont , puis enregistrez la texture dans un fichier d'image raster. Une fois que des charges de l'application, il doit charger l'image de texture et les coordonnées de la texture de glyphe (4 coordonnées pour chaque glyphe) et pour générer les listes d'affichage (une liste pour chaque glyphe, chaque liste d'affichage dessinera un seul glyphe comme quad à texturé).

Chaque courte représentation d'un glyphe doit avoir une liste d'affichage correspondante (leur valeur de grande valeur et GLListBase peut aider à cela).

Je suppose que le chargement d'une texture est plus rapide que la génération de listes d'affichage de police au moment de l'exécution. De plus, vous vous déplacez hors ligne le calcul raster de glyphe. Mais la génération de liste d'affichage peut être lourde (de nombreux glyphes). En effet, vous pouvez exécuter dans un fil séparé la génération de liste d'affichage ou générer uniquement les listes d'affichage requises par vos besoins.


0 commentaires

3
votes

Ne pas pré-construire les listes d'affichage: - Créez un sprite intermédiaire qui construit les listes à la demande et les met en caches. En essayant de pré-calculer des listes - ou pré-générer des textures rastralisées à chaque taille de la police, la face de police, et pour tous les caractères, n'est pas impratible, surtout lorsque vous échouez à des ensembles de caractères extrêmes de l'Est.


3 commentaires

Utiliser des objets de tampon de sommet serait très agréable! Les rastres de polices pourraient être en haute résolution, puis Mipmaps et Multissempling Multiisampling font le reste.


Donc, vous voulez dire que je devrais générer les listes une fois que je sais quels caractères je devrai dessiner pour une chaîne donnée?


Oui. Face à un problème similaire - et à utiliser la bibliothèque OpenType (pour l'idependance de la plate-forme plutôt que WGL), nous avons rendu des textures rastralisées contenant des rendus de mots. Nous mettons ensuite en cache les mots visibles et je rejette tous les mots qui ont été défilés. Notre application ne montre qu'une petite quantité de texte, sans exigences de formatage très compliquées, mais il y a suffisamment de texte potentiel qui pré-rendu tout cela entraînerait des retards visibles.