OpenGL

Página  6  de  8  

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

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8