|
6. Exemplo: Três Tipos de Texto |
Para ilustrar a flexibilidade do OpenGL no
desempenho de diferentes tipos de tarefas de rendering, mostramos três métodos
para a visualização de texto. Os três métodos são: a utilização de bitmaps, a
utilização de segmentos de recta para gerar texto de contorno e a utilização de
texturas para gerar texto suavizado (antialiased) [6].
O primeiro método define a fonte como uma série de display lists,
cada uma contendo um único bitmap:
for i = start + ‘a’ to start + ‘z’
{
glBeginList(i);
glBitmap( . . . );
glEndList();
}
O glBitmap especifica simultaneamente um ponteiro para a
codificação do bitmap e o offset que indica a posição relativa deste em relação
aos bitmaps anterior e seguinte. Em GLX, o efeito de se definir um dado número
de display lists, desta forma pode também ser alcançado através da função
glXUseXFont. Esta função gera um número de display lists, contendo cada uma um
bitmap (e os offset’s associados) de um caractere da fonte X especificada. Em
ambos os casos, a string “Bitmapped Text” cuja origem é a projecção da posição
em 3D produzida por:
glRasterPos3i(x, y, z);
glListBase(start);
glCallLists(“Bitmapped Text”, 14, GL_BYTE);
Ver figura 4. glListBase define uma display list de forma que as
funções glCallLists chamadas posteriormente, referem os caracteres definidos. O
segundo argumento desta função indica o comprimento da string e o terceiro
refere que a string é um array de 8-bit bytes (podem também ser usados inteiros
de 16 e 32 bits, para aceder a fontes com mais de 256 caracteres).
O segundo método, é similar ao primeiro embora use segmentos de
recta para desenhar cada caractere. Cada display list contém uma série de
segmentos de recta:
glTranslate(ox, oy, 0);
glBegin(GL_LINES);
glVertex(...);
...
glEnd();
glTranslate(dx-ox, dy-oy, 0);
A função glTranslate inicial actualiza a matriz de transformação
para posicionar o caractere relativamente á origem. O glTranslate final
actualiza a posição inicial do caractere de forma a preparar o carácter
seguinte. A string é visualizada com este método da mesma forma que no exemplo
anterior, mas como os segmentos de recta têm posições tridimensionais, o texto
pode ser orientado e posicionado em três dimensões (Figura 4b). Geralmente, as
display lists podem conter polígonos e segmentos de recta, podendo estes ser
antialiased.
Finalmente, surge como uma abordagem diferente a criação de uma
imagem de textura contendo um array de caracteres. Os diferentes alcances das
coordenadas da textura, correspondem aos vários caracteres na imagem. Cada
carácter, pode ser desenhado em qualquer tamanho e em qualquer orientação
tridimensional, desenhando um rectângulo, com as coordenadas de textura
apropriadas nos seus vértices:
glTranslate(ox, oy, 0);
glBegin(GL_QUADS)
glTextCoord(...);
glVertex(...);
...
glEnd();
glTranslate(dx-ox, dy-oy, 0);
Se cada grupo de comandos para cada caractere for incluído numa
display list, e os comandos para descrever a imagem de textura em si, forem
incluídos noutra display list chamada TEX, então a string “Texture Mapped Text!”
pode ser exibido por:
glCallList(TEX);
glCallLists(“Bitmapped Text”, 22, GL_BYTE);
Uma vantagem deste método, é que, usando simplesmente o filtro de
textura apropriado, os caracteres resultantes são suavizados (Figura 4c).
Figura 4 - Exemplo: Três Tipos de Texto