Texto Independente da Resolução de Renderização

11

Eu preciso de uma maneira de desenhar texto independente de resolução no meu jogo. Ou seja, eu preciso poder ampliar o texto e nunca ver artefatos de pixel.

Alguém pode fazer alguma sugestão sobre como eu poderia fazer isso?

Mike
fonte
Eu diria que você precisaria procurar métodos de fontes baseadas em vetores, em vez de fontes rasterizadas, que poderiam ser um ponto de partida. Como não sou especialista no assunto, deixarei alguém que saiba responder.
precisa

Respostas:

7

Existem três maneiras comuns de fazer isso. Na verdade, não se trata de eliminar artefatos completamente - o que é impossível, a menos que você tenha memória ou tempo de processador ilimitados -, mas sim como minimizá-los de uma maneira que se encaixe no código existente e nas plataformas de destino.

Primeiro, basta usar o rasterizador de fontes - geralmente FreeType - para rasterizar a fonte no tamanho que você deseja ampliar. Isso ficará ótimo nas capturas de tela, mas é incrivelmente lento. Você pode resolver a lentidão armazenando em cache os tamanhos, mas isso torna-se incrivelmente faminto por memória. Ele também não parece ótimo em movimento, porque fazer com que os glifos pareçam bons para a exibição estática requer dimensioná-los de maneira não uniforme. Ainda assim, é uma opção se você estiver em uma plataforma com memória suficiente (como um PC) e sua balança estiver limitada a um pequeno intervalo, como 10px a 30px. Este método também não admite muito colírio para os olhos.

Segundo, você pode armazenar seu texto como uma malha. Algumas bibliotecas existem para fazer isso, como GLTT , ou você pode escrever sua própria. Agora você não tem mais artefatos de pixel, mas terá artefatos poligonais se ampliar muito de perto - como qualquer outra malha em um jogo 3D. O texto de malha admite muito colírio para os olhos, pois os shaders de vértice podem ser aplicados e a malha pode ser intercalada com qualquer outro desenho do mundo que você fizer. É razoavelmente leve na memória e na CPU e fácil de medir o custo, pois é apenas uma malha padrão. Pode ser difícil integrar um pipeline de renderização 2D normal baseado em sprite.

Terceiro, você pode usar campos de distância em combinação com um sombreador de pixels . Essa é uma técnica relativamente nova que é popular atualmente, usando o sombreador simples para experimentar uma textura pré-fabricada e a filtragem bilinear "gratuita" na sua placa de vídeo para aumentar os glifos de maneira limpa. Ele usa pouca memória e facilmente previsível em comparação com outros métodos - uma textura de 0,5 MB a 1 MB por conjunto de caracteres por fonte. Ele se encaixa perfeitamente nos pipelines de renderização baseados em sprites, porque é baseado em sprites; cada glifo ainda é um quad texturizado. Produz artefatos de pixel, mas muito poucos em comparação com outros métodos que escalam texturas. Também há um fallback de função fixa se os pixel shaders não estiverem disponíveis, mas o texto acaba sendo muito alias. Como a amostragem é feita em um pixel shader, ele permite alguns colírios, como delinear e sombrear, por um preço baixo.


fonte
3

Há também um artigo de pesquisa da Microsoft Research de Loop e Blinn, sobre renderização de curvas independentes de resolução usando shaders. Ele sugere o uso da técnica apresentada para renderizar o texto TrueType de maneira independente da resolução.

macbirdie
fonte
1

Você precisará criar os caracteres da fonte com uma combinação de curvas e linhas, que depois serão convertidas em geometria com um nível adequado de detalhes em tempo de execução.

Felizmente, a maioria das fontes já foi criada a partir de curvas de bezier. Para obter os dados da curva, basta usar a função padrão do Windows GetGlyphOutline () para extraí-los.

Não tenho certeza se você pode obter os dados dessa curva em C # sem o PInvoke.

Adão
fonte
1
Para criar essa plataforma cruzada e não se preocupar com o material do PInvoke, parece-me que você seria capaz de escrever uma ferramenta para despejar os dados que GetGlyphOutline lê (consulte esta pergunta SO ) em algum formato personalizado e, em seguida, alguma E / S de arquivo simples no código do jogo para carregar apenas os dados de glifo armazenados personalizados.
Ricket
0

Você pode dar uma olhada no tipo livre. Não tenho idéia se está disponível na sua plataforma ou se a licença é aplicável, mas é uma excelente biblioteca de código-fonte aberto para renderizar fontes vetoriais de tipo verdadeiro e outras. Eu acredito que eles tiveram que fazer algum advogado inteligente que evita o código para conseguir que as fontes sejam renderizadas de uma maneira esteticamente agradável. A maneira verdadeira de digitar envolve códigos de bytes nas curvas para fornecer dicas ao renderizador, para que recursos importantes da fonte (como verticais e serifas) não fiquem desfocados, como usariam o anti-aliasing ingênuo padrão. Essa técnica possui uma patente, então o pessoal do tipo livre teve que inventar outra coisa que fizesse o trabalho e não invocou o terrível advogado-animal da (eu acho) Apple. De qualquer forma, deixando de lado a legalidade, tente investigar o tipo livrehttp://freetype.sourceforge.net/index2.html

Lutero
fonte