Maneira preferida de renderizar texto no OpenGL [fechado]

17

Estou prestes a pegar computação gráfica mais uma vez para um projeto universitário. Para um projeto anterior, usei uma biblioteca chamada FTGL que não me deixou muito satisfeito, pois parecia meio pesado (tentei muitas técnicas de renderização, a renderização de texto não era muito boa).

Minha pergunta é: existe uma biblioteca boa e eficiente para isso? Caso contrário, qual seria a maneira de implementar um texto rápido, mas bonito? Alguns usos pretendidos são:

  • Rótulos flutuantes de objetos / caracteres
  • Diálogos
  • Menus
  • HUD

EDIT: De preferência também pode carregar fontes

dukeofgaming
fonte
1
Este é um "qual tecnologia usar a pergunta" e, portanto, provavelmente deve ser fechado.
Laurent Couvidou

Respostas:

4

Uma estrutura popular é a GUI de Crazy Eddie .

Mas, embora isso seja atraente, não é incomum lançar o seu próprio (e talvez se arrepender, pois o escopo aumenta mais tarde;))

É normal ter seus glifos em bitmaps e desenhá-los usando o OpenGL.

Às vezes, você mostra texto transitório que pode aparecer apenas em alguns quadros. Basta usar GL_QUADS + glVertex será suficiente. Mas, para qualquer grande quantidade de texto ou longa duração de visibilidade, vale a pena colocar o GL_QUADS em um VBO - notei grandes melhorias de desempenho com isso.

É claro que existe a questão de gerar os glifos reais que você precisa. Existem programas como o bmfont que você pode usar para isso. Ou você pode precisar de uma renderização um pouco mais complicada, por exemplo, tipo livre sob demanda. Eu tenho usado bmfont com meu próprio renderizador muito feliz, é muito simples deduzir.

Vai
fonte
9

Existem várias maneiras - dependendo do que você deseja ... Como em qualquer outro lugar, não há algo como "a melhor solução". Qual plataforma é seu alvo? Qual idioma você está usando? O que é redimensionamento / rotação de texto - é necessário? Você precisa ser capaz de renderizar TrueTypeFonts? O que é Multilanguage / Unicode? Como você deseja armazenar seu texto (qual codificação etc.)?

Eu usei no passado também o FTGL, bem como o tipo de código puro (http://www.freetype.org/ O FTGL é baseado nisso), diferentes tipos de fontes de bitmap, fontes de contorno ... Agora, estou mais viciado em bitmap fontes, mas isso é apenas minha preferência pessoal. Como não quero mais lidar com diferentes charsets, codificação e coisas assim - o licenciamento para bitmapfonts também é mais fácil e barato do que para TrueTypeFonts. E é utilizável em todas as plataformas que podem carregar imagens. Eu uso simplesmente um quad no openGL e mapeio uma parte da minha textura nele. O outro lado é: A fonte será redimensionável apenas com um fator de cerca de +/- 50%. Se você pode conviver com isso, sugiro usar um bitmapfont.

Se você também precisar lidar com diferentes codificações / conjuntos de caracteres, deverá encontrar uma maneira de carregar e usar o TrueTypeFonts (como no freetype, usando outra biblioteca ou com sua própria implementação) ...

Veja também os tutoriais diferentes da nehes sobre este tópico:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Fontes de bitmap

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Fontes de estrutura de tópicos

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Fontes de estrutura de tópicos mapeadas para textura

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Fonte de textura 2D

Boa sorte!

Constantin
fonte
+1 Obrigado pelas informações valiosas sobre desempenho, eu sabia sobre os tutoriais de NeHe. Acho que usei fontes de bitmap ... mas não foi dimensionado: cerca de 60 rótulos flutuando em uma cena acima de esferas unidas por linhas, alguma ideia disso? (Eu estava pensando que eu deveria ter olhado para uma maneira de implementar um FLYWEIGHT)
dukeofgaming
1
Cuidado: Os tutoriais do NeHe são para o antigo pipeline de funções fixas e não são atualizados com frequência. Se você estiver procurando por uma moderna solução OpenGL ver stackoverflow.com/questions/5262951/...
brita_
6

Se você quiser usar fontes de bitmap, não poderá errar muito com o Angelcode Bitmap Font Generator: http://www.angelcode.com/products/bmfont/

Ele converte uma fonte truetype em uma ou mais texturas (com glifos bem compactados) e gera um pequeno arquivo contendo os UVs e espaçamentos (acho que a saída XML é particularmente fácil de trabalhar, e a qualidade dos dados de espaçamento é geralmente muito bom, mesmo sem o verdadeiro kerning)

bluescrn
fonte
1

Estou usando as bibliotecas de Sean Barret para renderizar truetype-glyphs no OpenGL (stb_image, stb_truetype).

O projeto de reformulação / desvio está usando essas bibliotecas para criar uma interface de usuário ( IMUI )

Marco Schmidt
fonte
0

Considere QML . É uma biblioteca de interface do usuário totalmente funcional com uma sintaxe fácil de usar. Seu conjunto de recursos é significativamente melhor que o CEGUI na minha experiência e possui melhor documentação, suporte e comunidade, pois seu principal objetivo são aplicativos de desktop e a capacidade de renderizar fora da tela é apenas uma espécie de bônus.

Prós:

  • Ele usa o OpenGL no back-end para todas as renderizações
  • Ele pode carregar qualquer fonte disponível para o sistema host e também pode analisar fontes adicionais incluídas como recursos
  • Ele usa renderização de texto em campo de distância assinada para saída eficiente e de alta qualidade
  • Ele pode renderizar diretamente em uma textura OpenGL, para que você possa colocar os resultados em seu ambiente de jogo facilmente
  • O Qt possui muitas ligações de idiomas

Contras:

  • Qt é uma grande estrutura
  • O uso de QML em projetos Direct3D ou Vulkan exige que você pule para obter a textura GL na API apropriada (ou aguardando que alguém escreva renderizadores D3D / Vulkan nativos para QML)
  • Ainda existem algumas peculiaridades menores na QML em que ele tentará usar um controle nativo, mesmo se você estiver renderizando para uma superfície fora da tela, como quando você tenta abrir um menu suspenso para um item da lista.
Jherico
fonte