Atualmente, estou desenvolvendo um pequeno jogo OpenGL para a plataforma Android e me pergunto se existe uma maneira fácil de renderizar texto em cima do quadro renderizado (como um HUD com a pontuação do jogador etc.). O texto precisaria usar uma fonte personalizada também.
Eu vi um exemplo usando uma View como uma sobreposição, mas não sei se quero fazer isso, pois talvez queira portar o jogo para outras plataformas posteriormente.
Alguma ideia?
android
opengl-es
text-rendering
abalado
fonte
fonte
Respostas:
O SDK do Android não vem com nenhuma maneira fácil de desenhar texto nas visualizações OpenGL. Deixando você com as seguintes opções.
fonte
A renderização de texto em uma textura é mais simples do que a demonstração do Texto de Sprite faz parecer, a idéia básica é usar a classe Canvas para renderizar em um Bitmap e depois passar o Bitmap para uma textura OpenGL:
fonte
Eu escrevi um tutorial que expande a resposta postada por JVitela . Basicamente, ele usa a mesma ideia, mas, em vez de renderizar cada string em uma textura, renderiza todos os caracteres de um arquivo de fonte em uma textura e o usa para permitir a renderização dinâmica completa do texto sem mais lentidões (quando a inicialização é concluída) .
A principal vantagem do meu método, em comparação com os vários geradores de atlas de fontes, é que você pode enviar pequenos arquivos de fonte (.ttf .otf) com seu projeto, em vez de ter que enviar bitmaps grandes para cada variação e tamanho de fonte. Ele pode gerar fontes de qualidade perfeita em qualquer resolução usando apenas um arquivo de fonte :)
O tutorial inclui código completo que pode ser usado em qualquer projeto :)
fonte
De acordo com este link:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Você pode renderizar qualquer exibição em um bitmap. Provavelmente, vale a pena supor que você pode fazer o layout de uma exibição conforme necessário (incluindo texto, imagens etc.) e depois renderizá-la em um Bitmap.
Usando o código da JVitela acima, você poderá usar esse Bitmap como uma textura OpenGL.
fonte
Dê uma olhada no CBFG e na porta Android do código de carregamento / renderização. Você deve poder soltar o código no seu projeto e usá-lo imediatamente.
CBFG - http://www.codehead.co.uk/cbfg
Carregador Android - http://www.codehead.co.uk/cbfg/TexFont.java
fonte
Eu olhei para o exemplo de texto do sprite e parece muito complicado para uma tarefa como essa, também considerei renderizar uma textura, mas estou preocupado com o impacto no desempenho que pode causar. Talvez eu precise apenas visualizar e me preocupar em portar quando for a hora de atravessar a ponte :)
fonte
Veja o exemplo "Texto de Sprite" nos exemplos GLSurfaceView .
fonte
IMHO, existem três razões para usar o OpenGL ES em um jogo:
Desenhar texto é sempre um problema no design de jogos, porque você desenha coisas, portanto não pode ter a aparência de uma atividade comum, com widgets e assim por diante.
Você pode usar uma estrutura para gerar fontes Bitmap a partir de fontes TrueType e renderizá-las. Todas as estruturas que eu vi funcionam da mesma maneira: gere as coordenadas de vértice e textura para o texto em tempo de desenho. Este não é o uso mais eficiente do OpenGL.
A melhor maneira é alocar buffers remotos (objetos de buffer de vértice - VBOs) para os vértices e texturas no início do código, evitando as operações de transferência de memória lenta no tempo de desenho.
Lembre-se de que os jogadores não gostam de ler texto, portanto, não escreverá um texto longo gerado dinamicamente. Para rótulos, você pode usar texturas estáticas, deixando texto dinâmico por tempo e pontuação, e ambos são numéricos com alguns caracteres.
Então, minha solução é simples:
As operações de desenho são rápidas, se você usar buffers estáticos remotos.
Crio um arquivo XML com posições de tela (com base na porcentagem diagonal da tela) e texturas (estática e caracteres) e carrego esse XML antes da renderização.
Para obter uma alta taxa de FPS, evite gerar VBOs na hora da compra.
fonte
Se você insistir em usar o GL, poderá renderizar o texto em texturas. Supondo que a maior parte do HUD seja relativamente estática, você não precisará carregar as texturas para texturizar a memória com muita frequência.
fonte
Dê uma olhada na
CBFG
porta Android do código de carregamento / renderização. Você deve poder soltar o código no seu projeto e usá-lo imediatamente.CBFG
Carregador Android
Estou com problemas com esta implementação. Ele exibe apenas um caractere. Quando tento alterar o tamanho do bitmap da fonte (preciso de letras especiais), o sorteio inteiro falha :(
fonte
Estou procurando por isso há algumas horas, este foi o primeiro artigo que encontrei e, embora tenha a melhor resposta, as respostas mais populares que acho que estão erradas. Certamente pelo que eu precisava. as respostas de weichsel e shakazed estavam no botão, mas um pouco obscurecidas nos artigos. Para colocá-lo direto no projeto. Aqui: basta criar um novo projeto Android com base na amostra existente. Escolha ApiDemos:
Procure na pasta de origem
ApiDemos/src/com/example/android/apis/graphics/spritetext
E você encontrará tudo o que precisa.
fonte
Para texto estático :
Para textos longos que precisam ser atualizados de vez em quando:
Para um número (formatado em 00.0):
No seu evento onDraw, atualize apenas a variável de valor enviada ao shader.
O código acima funciona para um atlas de textura em que os números começam em 0 na 7ª coluna da 2ª linha do atlas de fonte (textura).
Consulte https://www.shadertoy.com/view/Xl23Dw para obter uma demonstração (com textura incorreta)
fonte
No OpenGL ES 2.0 / 3.0, você também pode combinar o OGL View e os elementos de interface do usuário do Android:
Crie o layout activity_gl.xml:
Para atualizar elementos do encadeamento de renderização, use Handler / Looper.
fonte