Códigos-fonte em C e em Java dos exemplos em OpenGL v1.1 Programming Guide (Redbook)

Esta página é uma adaptação/tradução da página que contém códigos em C e do site que contém os mesmos códigos em Java/JOGL. Alguns exemplos foram transcritos para Java/JOGL por mim no ambiente Eclipse, antes dos códigos portados por Kiet Le serem disponíveis.

Os códigos em C foram distribuídos pela SGI junto com a versão de OpenGL 1.1 em 1997. Eles são muito úteis para introdução à programação de OpenGL, mas não cobrem técnicas avançadas. Para os interessados em explorar o potencial do OpenGL, recomendamos consultar a lista.

Download de todos os códigos num único arquivo zip-comprimedos: em C e em Java.

Este programa mostra como se desenha linhas não-serrilhadas no modo de cor por índice. Ele desenha duas linhas diagonais na forma de X; quando a tecla 'r' for acionada na janela, as linhas rotacionam em direções opostas.

Código-fonte: aaindex.c.

Não foi possível implementar o modo indexado em Java, porque a classe GLCapabilities não dispõe de um método que permite selecionar o modelo de cor utilizado num contexto gráfico. Acreditamos que isso deve ao fato de que os objetos da classe Graphics não podem ser instanciados para assegurar a portabilidade de Java.


Este programa mostra como se desenha linhas não-serrilhadas no modo de cor RGB. Ele desenha duas linhas diagonais na forma de X; quando a tecla 'r' for acionada na janela, as linhas rotacionam em direções opostas.

Código-fonte: aargb.c e Aargb.java.


Um exemplo simples de uso do buffer de acumulação para redução de efeitos de serrilhamento.

Código-fonte: accanti.c e Accanti.java.


Uso do buffer de acumulação para atenuar os efeitos de serrilhamento numa cena completa projetada perspectivamente. Foram utilizadas as rotinas especiais accFrustum() e accPerspective().

Código-fonte: accpersp.c e Accpersp.java.


Este programa desenha um conjunto de polígonos cheios sobrepostos para demonstrar o efeito da ordenação destes sobre os resultados da interpolação dos valores de alfa. Utilize a tecla 't' para alternar a ordem do desenho dos polígonos.

Código-fonte: alpha.c e Alpha.java.


Este programa demonstra uma forma de intercalar polígons opacos e translúcidos (interpolação dos valores de alfa) numa mesma cena utilizando glDepthMask. Acione a tecla 'a' para mover os objetos translúcidos entre os objetos opacos. Acione a tecla 'r' para resetar a cena.

Código-fonte: alpha3D.c e Alpha3D.java.


Este programa utilize os evaluators para desenhar a curva de Bézier.

Código-fonte: bezcurve.c e Bezcurve.java.


Este programa renderiza uma superfície de Bézier iluminada, demonstrando a utilização dos evaluators de duas dimensões.

Código-fonte: bezmesh.c e Bezmesh.java.


Este programa renderiza uma malha de Bézier usando os evaluators bi-dimensionais.

Código-fonte:bezsurf.c e e Bezsurf.java.


Este programa de texturização mapeia uma imagem de xadrez em dois retângulos. Ele suprime a textura, se as coordenadas da textura estiveram fora do intervalo [0.0,1.0].

Código-fonte: checker.c e Checker.java.


Este programa demonstra planos arbitrários de recorte.

Código-fonte: clip.c e Clip.java.


Após a inicialização, o programa vai estar no modo de ColorMaterial. Interação: acione os botões de mouse para alterar os valores de reflexão difusa.

Código-fonte: colormat.c e Colormat.java.


Este programa demonstra uma transformação em geometria simples, glScalef(), e uma transformação em visualização simples, gluLookAt(). Uma caixa aramada é renderizada.

Código-fonte: cube.c e Cube.java.


Este programa demonstra o uso de buffer de acumulação para criar o efeito de campo de profundidade fora de foco. Os bules são desenhados várias vezes no buffer de acumulação. O volume de visualização, mantendo na mesma posição, é ligeiramente "tremido", exceto no ponto focal. Somente o bule dourado, localizado no ponto focal, se mantém "no foco".

Código-fonte: dof.c e Dof.java.


Este é um simples programa em buffer duplo. Acione o botão de mouse esquerdo para rotacionar o retângulo. Acione a tecla do meio para parar a rotação.

Código-fonte: double.c e Double.java.


Desenha na tela (por váras vezes) a letra F em bitmap. Este programa demonstra o uso do método glBitmap().

Código-fonte: drawf.c e Drawf.java.


Este programa demonstra o uso do feedback do OpenGL. Primeiro, o ambiente iluminado é definido e algumas linhas são desenhadas. Entra-se no modo de feedback e as mesmas linhas são desenhadas. Os resultados no buffer de feedback são impressos.

Código-fonte: feedback.c e Feedback.java.


Este programa desenha 5 bules vermelhos, cada qual a uma distância z do ponto de visão e com distinto modelo de neblina. Acionando o botão esquerdo do mouse pode-se escolher dentre os 3 modelos de neblina o exponencial, o exponencial quadrado, ou o linear. Neste programa, o valor de densidade, como também os valores inicial e final do modelo de neblina linear, são fixos.

Código-fonte: fog.c e Fog.java.


Este progrma demonstra o modelo de neblina com uso do modelo de cor indexado. Três cones são desenhados a diferentes distâncias de z utilizando o modelo de neblina linear. 32 cores contíguas (de 16 a 47) são carregados com a rampa de cor.

Código-fonte: fogindex.c.

Não foi possível implementar o modo indexado em Java, porque a classe GLCapabilities não dispõe de um método que permite selecionar o modelo de cor utilizado num contexto gráfico. Acreditamos que isso se deve ao fato de que os objetos da classe Graphics não podem ser instanciados para assegurar a portabilidade de Java.


Este é um simples programa introdutório ao OpenGL.

Código-fonte: hello.c e Hello.java.


Este programa demonstra manipualções a nível de pixels e mostra o efeito de glDrawPixels(), glCopyPixels(), and glPixelZoom(). Interações: movimentar o mouse mantendo o seu botão pressionado copiará a imagem no canto inferior-esquerdo na posição do mouse, utilizando os fatores de aumento de pixel corrente. Não é provido mecanismo de proteção da imagem original. Se você acionar a tecla 'r', a imagem e os fatores de escla originais serão restaurados. Se você apertar a tecla 'z' ou 'Z', o fator de aumento será alterado.

Código-fonte: image.c e Image.java.


Este program demonstra o uso do modelo de iluminação do OpenGL. A esfera tem caracterástica de material cinza e é iluminada por uma única fonte de luz.

Código-fonte: light.c e Light.java.


Este programa demonstra as primitivas geométricas e os seus atributos.

Código-fonte: lines.c e Lines.java.


Este program demonstra como se constrói e se executa um display list. Observe que os atributos, como a cor e a matriz correntes, são modificados.

Código-fonte: list.c e List.java.


Este programa demonstra o uso do modelo de iluminação GL. Vários objetos são desenhados com diferente característica de material. Uma única fonte luminosa ilumina estes objetos.

Código-fonte: material.c e Material.java.


Este programa demonstra o uso da técnica de mipmaps na texturização. Para mostrar o efeito desta técnica, cada nível de detalhes do mapa mip tem uma cor "sólida", contrastando com a imagem de textura. Portanto, o quadrilátero é desenhado com distintas cores.

Código-fonte: mipmap.c e Mipmap.java.


Este programa demonstra o modelo de transformação implementado no OpenGL.

Código-fonte: model.c e Model.java.


Este programa demonstra quando se utiliza os comandos de transformação e de iluminação para renderizar uma cena com uma fonte de luz móvel, cujo movimento é controlado pela transformação em modelagem (rotação ou translação). A posição da fonte de luz é resetada após a transformação em modelagem é invocada. A posição do observador é fixa. A esfera é desenhada com uso de característica de material cinza. Uma única fonte luminosa é presente na cena. Interações: acionando o botão esquerdo do mouse é alterada a transformação em modelagem (rotação em torno do eixo x) por 30 graus. A cena é então rerenderizada com a luz na nova posição.

Código-fonte: movelight.c e Movelight.java.


Picking é demonstrado neste programa. No modo Rendering, três retângulos sobrepostos são desenhados. Quando o botão esquerdo do mouse é acionado, entra-se no modo Selection com a matriz de picking. Retângulos desenhados sob o cursor são "catados". Preste atenção no intervalo dos valores de profundidade retornados.

Código-fonte: pickdepth.c e Pickdepth.java.


Uso de nomes múltiplos e picking são demonstrados. Uma malha 3x3 de quadrados é desenhada. Quando o botão esquerdo do mouse é acionado, todos os quadrados sob o cursor tem as suas cores alteradas.

Código-fonte: picksquare.c e Picksquare.java.


Este programa mostra como se compõe transformações em modelagem para desenhar modelos deslocados e rotacionados. Interação: acionando as teclas 'd' e 'y' (dia e ano) altera a rotação do planeta em torno do sol.

Código-fonte: planet.c e Planet.java.


Este programa demonsta a técnica de offset para desenhar um polígono sólido e o mesmo na forma aramada sem os incômodos "defeitos" visuais ("stitching").

Código-fonte: polyoff.c e Polyoff.java.


Este programa demonstra o pontilhamento (stippling) de um polígono.

Código-fonte: polys.c e Polys.java.


Este programa demonstra o uso de algumas rotinas gluQuadric*. Objetos quádricos são criados com algumas propriedades quádricas e com uma rotina de callback para tratar os erros. Note que o cilindro não tem o topo nem a base e o círculo tem um buraco no meio.

Código-fonte: quadric.c e Quadric.java.


Este programa mostra como se compõe transformações em modelagem para deslocar e rotacionar modelos estruturados hierarquicamente. Interação: acionando as teclas 's' e 'e' (ombro e cotovelo) o braço do robô é rotacionado.

Código-fonte: robot.c e Robot.java.


Este programa demonstra o uso do modelo de iluminação GL. Objetos são desenhados com a caracterísitca de material cinza. Uma única fonte de luz ilumina estes objetos.

Código-fonte: scene.c e Scene.java.


Este é uma ilustração do modo de seleção e da pilha de nomes, que detecta objetos que colidem com o volume de visualização. Primeiro, quatro triângulos e uma caixa retangular representando o volume de visualização são desenhados (rotina drawScene). Os triângulos verde e amarelos aparecem dentro do volume e o triângulo vermelho, fora do volume. Entra-se, então, no modo de seleção. Encerra-se o processo de desenho sobre a tela. Para ver se a colisão ocorreu, os quatro triângulos são invocados. Neste exemplo, o triângulo verde caua um toque (hit) com o nome 1, e os triângulos amarelos causam um toque com o nome 3.

Código-fonte: select.c e Select.java.


Este programa demonstra tonalização suave. Um polígono com tonalização suava é desenhado em 2D.

Código-fonte: smooth.c e Smooth.java.


Este programa desenha dois toros rotacionados na janela. Um losango no centro da janela mascara uma parta destes modelos. Dentro desta máscara, um outro modelo (uma esfera) é desenhado com uma cor diferente.

Código-fonte: stencil.c e Stencil.java.


Este programa demonstra algumas características de uma fonte vetorial (em stroke). Os caracteres são representados por display lists, que recebem nomes correspondentes aos seus respectivos valores em ASCII. Uso do método glCallLists() é demonstrado.

Código-fonte: stroke.c e Stroke.java.


Este programa desenha uma superfície NURBS em forma de um monte com elevação simétrica.

Código-fonte: surface.c

O pacote javax.media.opengl.glu não dispõe o método glu.gluNurbsCallback().


Este programa demonsta um série de propriedades de material. Uma única fonte de luz ilumina os objetos.

Código-fonte: teapots.c e Teapots.java.


Este programa demonstra triangulação (subdivisão) de um polígono. Dois objetos subdivididos são desenhados. O primeiro é um retângulo com um buraco triangular. O segundo é uma estrela com auto-interseção e tonalização suave. Observe que os vértices do retângulo exterior são desenhados no sentido anti-horário e os vértices do contorno interno no sentido horário. Obeserve ainda que combineCallback foi necessário para desenhar a estrela e que removendo a propriedade TessProperty da estrela fica o interior sem (WINDING_ODD).

Código-fonte: tess.c e Tess.java.


Este programa demonstra as diferentes regras para contabilizar o número de giros dos contornos de um objeto no processo de triangulação. Quatro objetos triangulados (subdivisão), cada qual com contornos distintos, são desenhados. Quando a tecla 'w' é acionada, estes objetos são desenhados com distintas regras.

Código-fonte: tesswind.c e Tesswind.java.


Este programa demonstra o uso de glBindTexture() através da definição de duas texturas.

Código-fonte: texbind.c e Texbind.java.


Este programa desenha um bule com mapa de textura cujas coordenadas de textura foram geradas automaticamente. A textura é renderizada como faixas sobre a superfície do bule. Inicialmente, o objeto é desenhado com as coordenadas de textura definidas em termos das coordenadas do objeto e da distância em relação ao plano x=0. Acionando a tecla 'e' a referência das coordenadas é alterada para a referência da câmera. Acionando a tecla 'o' volta-se para a referência do objeto. Acionando a tecla 's' o plano de referência é alterado para o plano dado pela equação (x + y + z = 0). Acionando a tecla 'x' chaveia-se de volta para o plano x = 0.

Código-fonte: texgen.c e Texgen.java.


Este programa mapeia uma imagem de padrão de xadrez sobre dois retângulos. O programa suprime a textura, se as coordenadas da textura estiverem fora do intervalo [0.0,1.0]. Se a tecla 's' é acionada, uma subimage é utilizada para alterar a textura original. Se a tecla 'r' for pressionada, a textura original é restaurada.

Código-fonte: texsub.c e Texsub.java.


Este programa utiliza os evaluators para gerar uma superfície de forma livre e as coordenadas da textura.

Código-fonte: texturesurf.c e Texturesurf.java.


Este program demonstra a criação de um display list.

Código-fonte: torus.c e Torus.java.


Este programa desenha uma superfície NURBS em forma de uma montanha com elevação simétrica e utiliza uma curva NURBS e uma curva linear por parte (pwl) para recortar parte da superfície.

Código-fonte: trim.c

O pacote javax.media.opengl.glu não dispõe o método glu.gluNurbsCallback().


Este programa demonstra o uso do arranjo de vértices.

Código-fonte: varray.c e Varray.java.


Este programa mapeia uma imagem de padrão de xadrez em dois retângulos. Ele demonstra diferentes modos de mapeamento, se as coordenadas de textura assumirem valores fora do intervalo [0.0, 1.0]. Interação: acionando a tecla 's' ou 'S' alterna o modo de supressão e de repetição para o parêmetro s da textura. As chaves 't' e 'T' controlam o modo do parâmetro t da textura. Se executar este programa na versão OpenGL 1.0, os objetos de textura não serão utilizados.

Código-fonte: wrap.c e Wrap.java.


Wu Shin - Ting

Last modified: Tue Sep 16 18:17:08 2008

"Esta página, assim como todas as páginas sob esta mesma árvore, não é uma publicação oficial da UNICAMP, seu conteúdo não foi examinado e/ou editado por esta instituição. A responsabilidade por seu conteúdo é exclusivamente do autor."

"This page, as well as all pages under this same tree, is not an official publication from UNICAMP; its content has not been verified and/or edited by this institution. The author is solely responsible by its contents."