|
5. Integração num Sistema de Janelas |
O OpenGL desenha cenários tridimensionais e
bidimensionais para um framebuffer, mas para ser útil num ambiente heterogéneo,
o OpenGL deve ser subordinado a um sistema de janelas que aloca e controla os
recursos do framebuffer. Na descrição que se segue mostra-se como o OpenGL é
integrado no X Window System, mas a integração noutro sistema de janelas (por
exemplo, Microsoft Windows NT®) é semelhante.
O X oferece uma interface procedimental e um protocolo de rede para
criação e manipulação das janelas do framebuffer e desenho de certos objectos
bidimensionais nestas janelas. O OpenGL é integrado no X através de uma extensão
formal do X, designada por GLX. GLX consiste em dezenas de chamadas (com a
correspondente codificação para rede) que oferece uma integração compacta e
geral do OpenGL em X. Tal como noutras extensões de X (dois exemplos são o
Display PostScript e o PEX), há um protocolo específico de rede para os comandos
de rendering do OpenGL, encapsulados no X fluxo de bytes.
OpenGL requer uma região de um framebuffer na qual as primitivas
possam ser rendered. Em X, esta região designa-se drawable. Uma janela, do tipo
drawable, tem associada um visual que descreve a configuração do framebuffer da
janela. Em GLX, o visual é uma estrutura que inclui informação acerca dos
buffers de OpenGL que não estão presentes no X (profundidade, acumulação, etc.).
O X oferece ainda um segundo tipo de drawable, o pixmap, que não é
mais do que um framebuffer fora do monitor. GLX oferece um GLX pixmap que
corresponde a um X pixmap, mas com buffers adicionais. O GLX pixmap fornece
meios, às aplicações OpenGL, para a renderização fora do monitor num buffer
criado por software.
Para utilizar um drawable de OpenGL, o programador tem que criar um
contexto tendo como alvo esse drawable. Quando o contexto é criado, é
inicializada uma cópia da renderização do OpenGL com a informação visual do
drawable. Esta renderização é conceptualmente (se não verdadeiramente) parte do
servidor de X, de forma que, uma vez criado, um cliente X pode ligar-se ao
contexto do OpenGL e enviar comandos OpenGL (Figura 3). Múltiplos contextos
podem ser criados para os mesmos ou diferentes drawable’s. Qualquer drawable de
OpenGL pode também ser normalmente usado no desenho de X. As chamadas são
fornecidas para sincronizar imagens entre o OpenGL e o X. É da responsabilidade
do cliente efectuar esta sincronização caso seja necessária.
Figura 3 - Renderização do OpenGL, Cliente GLX e Servidor X
Um cliente de GLX que se encontra a correr num computador de cujo subsistema gráfico faz parte, pode evitar passar tokens para o servidor de X. Este direct rendering pode resultar num aumento do desempenho gráfico uma vez que, o overhead da codificação, descodificação e envio do token é eliminado. A renderização directa é suportada embora não seja um requisito do GLX (um cliente pode determinar se o servidor deve ou não fornecer a renderização directa). A renderização directa é possível, uma vez que a sequência entre os comandos de X e de OpenGL não necessita de ser mantida, excepto quando os comandos são explicitamente sincronizados.