Como os jogos lidam com a renderização de texto unicode asiático?

8

Atualmente, estou no processo de implementar a renderização de texto no meu mecanismo de jogo, e decidi utilizar o BMfont do AngelCode para gerar texturas de fonte e depois fazer o OpenGL renderizar quads texturizados para cada personagem. Isso funcionou muito bem, mesmo ao renderizar todos os glifos suportados pelo FreeFont (em particular o FreeMono), até eu tentar renderizar em japonês (minha fonte preferida em japonês é Noto, fornecida pelo Google).

A renderização de cada glifo suportado pelo FreeMono em 16px resultou em uma única textura de 1024x1024 8 bits, perfeitamente razoável, considerando quantos idiomas são cobertos por ele. A renderização de tudo o que é suportado pelo Noto Japanese, do mesmo tamanho, resultou em 13 vezes mais texturas, e nesse tamanho a maioria dos glifos é muito pequena para ser legível (não sei ler japonês, mas se eu pudesse, acho que seria ainda tem muitos problemas para ler este texto).

Minha pergunta é dupla:

1) Como os jogos ou aplicativos móveis lidam com pequenos textos em japonês? Eles aderem a um subconjunto do kanji, usam uma fonte especial ou há um tamanho mínimo de fonte?

2) Como os jogos geralmente lidam com o número absurdamente grande de glifos exigidos pelo japonês, chinês, coreano e outros idiomas? Eles usam o FreeType (ou algo semelhante) para renderizar o texto on-the-fly?

Nota: Eu tentei o Meiryo (que não tenho licença para usar no meu jogo) e o resultado foi muito mais legível em 16px (ainda que ainda esteja apertado), mas ainda exigi 14 texturas para caber em tudo.

Haydn V. Harach
fonte

Respostas:

6

Estou usando a biblioteca freetype ( http://www.freetype.org/ ) para carregar glifos de fontes freetype e depois usar o empacotamento em bin para gerar uma textura / atlas de glifo durante o tempo de execução, semelhante à maneira como o freetype-gl faz ( https : //code.google.com/p/freetype-gl/ ).

Quando o jogo é inicializado, eu gero um atlas de glifo com os caracteres imprimíveis do intervalo ASCII. Este atlas não muda durante o jogo. Um atlas adicional é usado para caracteres não-ascii.

Sempre que uma string é enfileirada para desenho, verifico se há um glifo que ainda não foi carregado. Se um glifo desse tipo for encontrado, marquei o atlas de glifos como sujo e regenero o atlas de glifos antes da renderização. Se o atlas estiver cheio, os glifos não-ascii serão eliminados se não estiverem em uso por um determinado período de tempo / quadros.

Há uma certa sobrecarga induzida pelo carregamento de glifos em tempo real e pela reconstrução do atlas de glifos, mas, por outro lado, quaisquer glifos suportados pela fonte podem ser usados ​​com este sistema.

Por outro lado, ainda não estou desenhando muitas coisas além do texto ...

Exilyth
fonte
5

Nos jogos em que trabalhei, restringimos o subconjunto de caracteres usados ​​para chinês, japonês e coreano (juntos chamados de CJK) apenas aos necessários para exibir o texto no jogo.

Em outras palavras, não tentamos empinar em todos os personagens possíveis; nós apenas pegamos o banco de dados de texto CJK de nossas equipes de localização, o examinamos para encontrar todos os pontos de código Unicode que ocorreram pelo menos uma vez no texto e geramos um arquivo de configuração do BMFont para definir um atlas para exatamente esses caracteres. (Era tudo automatizado, portanto, toda vez que recebíamos um novo loc drop, era possível gerar novamente a lista de caracteres e as fontes, conforme necessário.)

Como você pode imaginar, isso reduz bastante o número de caracteres necessários. Também compactamos os bitmaps de fonte com o DXT1, que funciona muito bem para texto (mesmo com antialias). O BMFont também tem a opção de usar todos os quatro canais de cores de uma imagem como páginas separadas (obtendo 4x o número de caracteres por página), mas isso não funciona tão bem com a compactação, por isso não a usamos.

Não tenho certeza sobre o tamanho da fonte. Se você não tem amigos que leiam CJK que podem dar uma olhada e dizer se é muito pequeno, tente assistir a filmes com legendas em CJK para ter uma idéia do tamanho do texto.

Nathan Reed
fonte
Obrigado pela contribuição. O que acontece se o usuário tiver permissão para inserir texto? Por exemplo, inserindo o nome do jogador ou uma caixa de bate-papo para um jogo online.
Haydn V. Harach 5/08/14
@ HaydnV.Harach Sim, a inserção de texto é um problema. Para o bate-papo, pode funcionar para limitar as coisas aos 1000 caracteres chineses mais comuns, ou algo assim; você teria que pedir a alguém que saiba mais sobre esses idiomas para ver se isso seria viável. Para o nome do jogador, talvez você possa renderizá-lo com o FreeType uma vez e armazenar em cache o bitmap para usar como um "caractere" extra no seu renderizador.
Nathan Reed