Como calcular o melhor glifo limites em um mapa de caracteres para OpenGL processamento de texto
-
21-12-2019 - |
Pergunta
Para compor o texto com OpenGL eu tirar a textura quad abordagem, eu desenhar um quadrilátero para cada caractere que precisa ser representado.Eu armazenar todos os caracteres textura de informações em uma única textura, e usar glScalef e glTranslatef na textura da matriz para seleccionar o carácter correcto na textura.No começo eu apenas coloquei alguns caracteres da imagem usada para criar a textura e ele funcionou bem.
Desde então eu precisava para tornar mais caracteres, como letras minúsculas.Eu tentei adicionar mais caracteres, mas agora o meu texto acaba desalinhada e menores.
Existe uma maneira correta para criar mapas de caracteres, ou é a minha abordagem, todos juntos errado?
Nota:Eu estou usando um mono-estilo de fonte para fonte dimensões não deve ser o problema, no entanto, gostaria de acrescentar o suporte para tipos de letra com a não-uniforme de tamanho de caracteres bem.
EDITAR:Eu estou usando um buffer de vértice para desenho em vez de modo imediato.
EDIT 2:A textura contendo o mapa de caracteres tem 9 linhas, cada uma com 11 caracteres.Já que os personagens são do mesmo tamanho, eu uso glscalef na textura da matriz de 1/9 a largura da textura, e 1/11 a altura.O VBO define a quad (0,0),(1,0),(0,1),(1,1) e tex coords (0,0),(1,0),(0,1),(1,1).O nonalignment parece ser devido à minha transformações não cabendo a cada glifo exatamente.Como o ideal limites para cada glifo calculado?
Solução
Na esperança de que isso pode ser útil para outras pessoas.O ideal glifo de limites pode ser calculado pela primeira normalizar o pixel deslocamentos de cada letra, de modo que eles são números no intervalo de 0 e 1.As larguras e alturas também pode ser normalizado para determinar o correto caixa delimitadora.Se as larguras e alturas são uniformes, como em mono fontes, estático valores de largura e altura podem ser utilizados para calcular o glifo limites.
Poupança de uma matriz de pixel valores de posição para cada imagem seria tedioso para calcular à mão, então é melhor começar o primeiro glifo no primeiro pixel do mapa de caracteres e manter sem espaçamento entre cada letra.Isto faria com que o cálculo da parte inferior esquerda coordenadas uv fácil com loops for
void GetUVs(Vector2* us, Vector2* vs, float charWidth, float charHeight, int cols, int rows)
{
for (int x = 0; x < cols; x++)
{
for (int y = 0; y < rows; y++)
{
int index = x + cols * y;
us[index].x = x * charWidth;
vs[index].y = y * charHeight;
}
}
}
O resto dos limites pode ser calculado adicionando a largura, a altura e a largura e a altura respectivamente.