jump to navigation

Utilizando a biblioteca OpenGL(R) a partir de Java Março 24, 2007

Posted by pablo in Java, Terceiros.
2 comments

Introdução

 

O OpenGL(R) é um dos mais difundidos e populares sistemas gráficos para rendering de gráficos 2D e 3D. É amplamente utilizado em projetos de pesquisa para visualização em geral e também utilizado em muitos jogos. Aproximadamente 60% dos jogos para Playstation, por exemplo, são feitos em OpenGL. O mais conhecido exemplo de jogo para PC construido inteiramente em OpenGL é o Quake da Id Software.

OpenGL funciona como uma máquina de estados complexa, cuja manipulação é feita através de rotinas simples que são invocadas por funções da API OpenGL. Normalmente as rotinas são executadas inteiramente dentro do Hardware da placa gráfica, caso esta tenha suporte nativo – o que é extremamente comum hoje em dia. De fato, qualquer placa que comprada hoje possuirá suporte direto as rotinas do OpenGL.

Comumente, o OpenGL possui bind completo em C, mas caso se deseje utiliza-la a partir de Java(tm), será preciso utilizar algum mecanismo que permita acessar os Entry-points do bind da implementação em C a partir da Virtual-Machine Java.

A maneira de fazer isso em Java é através de JNI (Java Native Interface). Na realidade existem muitas bibliotecas java já prontas que fornecem meios para acessar OpenGL a partir de java, utilizando JNI, com um bom grau de abstração.

Primeiramente vou começar explicando alguns tipos de aplicações que são possíveis de serem desenvolvidas com o OpenGL. Em seguida vou listar algumas opções para poder utilizar OpenGL a partir de Java.

Em meus anos de experiência com esta biblioteca gráfica, tive a oportunidade de conhecer bem a fundo seu potencial e seu poder de trabalho. Hoje em dia, as placas estão se tornando cada vez mais eficiêntes, e a nova geração GeForce 8800 possui um pipeline de processamento genérico, com 256 pipes. Isso significa que a placa gráfica hoje é capaz de executar uam quantidade enorme de instruções simples em série de maneira muito mais eficiente que os processadores comuns da CPU (por este motivo as aplicações modernas já procuram distribuir processamento entre a CPU e a GPU – Graphical Processor Unit).

O OpenGL fornece uma maneira de explorar todo o potencial do hardware da placa gráfica sem precisar se preocupar com uma linguagem de baixo nível (como assembly), o que realmente pode ser facinante. Para se ter uma ideia, é possível com o poder do hardware gráfico comum de hoje em dia renderizar uma cena complexa (milhões de triângulos e vértices) em frações de milésimos de segundo, o que é absolutamente impossível utilizando-se somente a CPU (que não é especializada e já possui uma grande carga do S.O).

Alguns exemplo de aplicação gráfica com OpenGL:

  • Sistemas 3D para visualização de plataformas de petróleo em tempo real.
  • Sistemas para visualização de dados geosísmicos e geográficos
  • Jogos tridimensionais de alto desempenho
  • Aplicações CAD ou de modelagem
  • Grafos 3D ou Aplicações de Engenharia em geral

De uma forma geral, programar em OpenGL não é um problema somente de programação. Manipular OpenGL simplesmente requer conhecimentos sobre geometria e projeção tridimensional , bem como de sua arquitetura interna. Mas para quem tem experiência com bibliotecas gráficas, é simples migrar para o OpenGL.

À baixo listei e descrevi as duas melhores opções (na minha opinião) para se usar OpenGL em Java. A primeira, JOGL, é uma opçao para quem gosta de bibliotecas que usam o paradigma de orientação a eventos. A segunda, que na minha opinião é mais simples, é uma opção para quem gosta de uma biblioteca mais ao estilo de uso da biblioteca OpenGL em C.

Opções para uso do OpenGL em Java:

  • The JOGL Java/OpenGL binding: Funciona através de eventos (listeners/observers). Possui interfaces Java que tem assinaturas de eventos de fucionamento, tais como:
    • display: chamada sempre que a cena precisar ser desenhada na tela.
    • displayChanged: chamada quando ocorrer alguma mudança na tela.
    • init: chamada uma única vez no inicio para se ’setar’ configurações iniciais do estado do OpenGL ou da propria aplicação Java.
    • reshape: Sempre que a janela for maximizada, minimizada ou reposicionada.
  • Lightweight Java Game Library: É uma biblioteca mais leve e que não é orientada a eventos. Isso pode tornar as coisas mais simples para quem está acostumado a utilizar a biblioteca OpenGL em C ou C++.

Em ambos os links das bibliotecas listadas, existe uma boa documentação para inicio de uso. É claro que, existem algumas outras opções para se utilizar OpenGL de java, tal como o Java3D. No entanto estas opções não são tão bem documentadas e, especificamente o Java3D, não é simplesmente um binding para OpenGL, ele é todo um toolkit gráfico construído em cima do OpenGL, o que significa que ele tem um nível muito alto de abstração e possui grafo de cena e classes complexas. Ele pode ser uma boa opção para quem quer construir aplicações complexas ou jogos, pois certamente aplicações desse tipo requerem uma abstração em cima do OpenGL. Com as bibliotecas que eu citei, você mesmo pode construir uma outra biblioteca que abstrai de maneira particular as funcionalidades do OpenGL. Mas é claro que é preciso ter em mente que isso pode ser algo bem trabalhoso, então o Java3D pode ser uma boa opção em alguns casos.