Sexta Lista - Rasterização


Aquecimento

  1. Modifique a largura (através do parâmetro da função glLineWidth) e a inclinação (através dos argumentos da macro drawOneLine) das linhas definidas pelo programa lines.c da primeira lista. Comente como os dois parâmetros afetam o efeito de serrilha.
  2. Inclua no Makefile os comandos necessários para gerar o executável do programa drawf.c adaptado do livro OpenGL Programming Guide.
    1. Identifique as função que estão relacionadas com a "imageação" (rendering) dos três caracteres F por modo bitmap.
    2. Altere a definição da variável rasters para que o tamanho dos caracteres se duplique.
    3. O que acontecerá se forem alterados somente os dois primeiros argumentos da função glBitmap?
    Observação: GLUT provê funcionalidades para "imagear" as fontes no modo bitmap (glutBitmapCharacter) e no modo stroke (glutStrokeCharacter), como demonstra o programa fontdemo.c. Qual é a diferença entre estes dois modos?
  3. Inclua no Makefile os comandos necessários para gerar o executáveis do programa border.c implementado pelo Marcelo.
    1. Identifique o trecho de código que carrega os índices de cor. Qual é a faixa de cores definida?
    2. Identifique o trecho de código que atribua um índice de cor para cada pixel da imagem. Quantos índices foram utilizados na atribuição? O que acontecerá se alterarmos a macro definição de SLOPE? O que acontecerá se substituirmos a atribuição
      RAMPSTART+RAMPSIZE-1 por RAMPSTART+RAMPSIZE-XXX-1, sendo XXX um valor inteiro entre 0 e 63?
    3. Identifique o trecho de código que desenha a imagem criada na tela. O que acontecerá se alterarmos os valores dos argumentos da função glPixelZoom?
  4. Uso apropriado de padrões de preenchimento de área pode "emular" efeitos de transparência, como demonstra o programa screendoor.c. Identifique os padrões utilizados para cada nível de "opacidade".
  5. Desde a primeira lista temos utilizado a biblioteca de funções utilitárias, GLUT, para criar uma janela (ou seja, tamanho, posição, aparência e o bordo de uma área da tela) capaz de visualizar as imagens geradas por OpenGL/ OpenGL para WNT'95 e para interfacear os eventos gerados pelos usuários. Estas funções foram criadas em cima do sistema X Windows tanto para inicialização de ambientes de janelas:
    1. glutInit;
    2. glutInitWindowPosition, glutInitWindowSize;
    3. glutInitDisplayMode;
    4. glutMainLoop;
    como para tratamento de eventos:
    1. glutDisplayFunc;
    2. glutReshapeFunc;
    3. glutKeyboardFunc;
    4. glutSpecialFunc;
    5. glutMouseFunc;
    6. glutEntryFunc;
    7. glutVisibilityFunc;
    8. glutIdleFunc.
    Existem ainda funções para gerenciar menus e janelas. O programa sphere.c demonstra o gerenciamento de multi-janelas e o programa subwin.c exemplifica a geração de subjanelas na área de desenho. Qual é a diferença entre multi-janelas e sub-janelas?
  6. Como vimos, durante o processo de rasterização a extensão de um objeto é mapeada aos pixels da área da janela de exibição. OpenGL/ OpenGL para WNT'95 faz uso deste fato para implementar um mecanismo de seleção, como demonstram os programas adaptados do livro OpenGL Programming Guide: pickline.c, picksquare.c e pickdepth.c. O programa triselect.c, por sua vez, ilustra uma aplicação deste mecanismo.
    1. Qual comando especifica o modo de "rasterização com seleção"?
    2. Como se define a área de seleção de interesse (em geral, a área "coberta" pelo cursor)?
    3. Onde são armazenadas as identificações (ou os nomes) dos objetos selecionadas?

Programação

  1. Modifique o programa drawf.c, de forma a armazenar na variável rasters a definição de uma circunferência de raio igual a 30 pixels. Os valores de cada pixel (1 ou 0) devem ser gerados pelo algoritmo de Bresenham.
  2. Inclua no programa border.c um trecho de código que utilize a técnica pré-filtragem para reduzir o efeito de serrilhado. Se for necessário, utilize todos os tons de cinza disponíveis.
    Dica: Consulte a seção 2-26 do livro Procedural Elements for Computer Graphics.
  3. Inclua no programa image.c implementado pelo Marcelo um trecho de código que utilize o algoritmo de Floyd-Steinberg para quantizar os tons de cinza da imagem em dois níveis (preto e branco).

  4. Voltar para a lista anterior.
    Avançar para a próxima lista.