computação gráfica i

99
Instituto de Computação - UFF 1 Computação Computação Gráfica I Gráfica I Professor : Anselmo Montenegro www.ic.uff.br/~anse lmo Conteúdo : - Introdução à OpenGL

Upload: affrica

Post on 19-Mar-2016

35 views

Category:

Documents


0 download

DESCRIPTION

Professor : Anselmo Montenegro www.ic.uff.br/~anselmo. Computação Gráfica I. Conteúdo : - Introdução à OpenGL. OpenGL: introdução. OpenGL é uma biblioteca gráfica . É uma interface em software para os dispositivos gráficos. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Computação Gráfica I

Instituto de Computação - UFF 1

Computação Gráfica IComputação Gráfica IProfessor:

Anselmo Montenegrowww.ic.uff.br/~anselmo

Conteúdo: - Introdução à OpenGL

Page 2: Computação Gráfica I

Instituto de Computação - UFF 2

OpenGL:OpenGL: introdução introdução

• OpenGLOpenGL é uma é uma biblioteca gráficabiblioteca gráfica..

• É uma É uma interfaceinterface em software para os em software para os dispositivos gráficos.dispositivos gráficos.

• AA interface consist interface consiste de comandos para e de comandos para especificar objetos e operaçõesespecificar objetos e operações que compõem que compõem aplicações gráficas 2D e 3Daplicações gráficas 2D e 3D..

Page 3: Computação Gráfica I

Instituto de Computação - UFF 3

OpenGL:OpenGL: características características

• Possui primitivas e operações para a geração e Possui primitivas e operações para a geração e manipulação de dados manipulação de dados vetoriaisvetoriais e e matriciaismatriciais..

• Capaz de gerar imagens de Capaz de gerar imagens de alta qualidadealta qualidade..

• Comumente implementado de forma a tirar partido da Comumente implementado de forma a tirar partido da aceleração gráficaaceleração gráfica (se disponível). (se disponível).

• Independente de plataformaIndependente de plataforma..

Page 4: Computação Gráfica I

Instituto de Computação - UFF 4

OpenGL:OpenGL: características características

• Possui primitivas e operações para a geração e Possui primitivas e operações para a geração e manipulação de dados manipulação de dados vetoriaisvetoriais e e matriciaismatriciais..

• Capaz de gerar imagens de Capaz de gerar imagens de alta qualidadealta qualidade..

• Comumente implementado de forma a tirar partido da Comumente implementado de forma a tirar partido da aceleração gráficaaceleração gráfica (se disponível). (se disponível).

• Independente de plataformaIndependente de plataforma..

Page 5: Computação Gráfica I

Instituto de Computação - UFF 5

OpenGL:OpenGL: o que é capaz de fazer o que é capaz de fazer

• Não gerencia janelasNão gerencia janelas nem trata eventosnem trata eventos produzidos por dispositivos de interação.produzidos por dispositivos de interação.

• Não possui comandos de alto nívelNão possui comandos de alto nível para para especificação de objetos 3D complexos.especificação de objetos 3D complexos.

• Objetos complexos devem ser construídos a Objetos complexos devem ser construídos a partir de primitivas geométricas simples.partir de primitivas geométricas simples.

Page 6: Computação Gráfica I

Instituto de Computação - UFF 6

OpenGL:OpenGL: o que não é capaz de fazer o que não é capaz de fazer

• Cria descrições matemáticas de objetosCria descrições matemáticas de objetos a a partir de primitivas geométricas (pontos, partir de primitivas geométricas (pontos, linhas e polígonos) e imagens/bitmaps.linhas e polígonos) e imagens/bitmaps.

• Organiza os objetos no espaço 3DOrganiza os objetos no espaço 3D e e seleciona o ponto de vista adequado para a seleciona o ponto de vista adequado para a cena.cena.

Page 7: Computação Gráfica I

Instituto de Computação - UFF 7

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

Page 8: Computação Gráfica I

Instituto de Computação - UFF 8

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

Page 9: Computação Gráfica I

Instituto de Computação - UFF 9

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

Page 10: Computação Gráfica I

Instituto de Computação - UFF 10

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

Page 11: Computação Gráfica I

Instituto de Computação - UFF 11

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

• RenderingRendering – processo através do qual um – processo através do qual um computador gera imagens a partir de um modelo.computador gera imagens a partir de um modelo.

• Pixel Pixel – menor elemento visível que um dispositivo – menor elemento visível que um dispositivo gráfico pode apresentar. Uma imagem é formada por gráfico pode apresentar. Uma imagem é formada por vários pixels.vários pixels.

• Plano de bitsPlano de bits – área de memória que armazena um – área de memória que armazena um bit de informação para cada pixel.bit de informação para cada pixel.

• FramebufferFramebuffer – estrutura que armazena todas as – estrutura que armazena todas as informações necessárias para que o display gráfico informações necessárias para que o display gráfico possa controlar a intensidade da cor em cada pixel.possa controlar a intensidade da cor em cada pixel.

Page 12: Computação Gráfica I

Instituto de Computação - UFF 12

OpenGL:OpenGL: arquitetura arquitetura ((pipeline gráficopipeline gráfico))

PixelsPixels

VérticesVértices

Listas deDisplay

AvaliadorPolinomial

Operaçõespor vértice

& Montagemde primitivas

Rasterização

Memória de Textura

Operaçõespor Fragmento

FrameBuffer

Operaçõessobrepixels

Page 13: Computação Gráfica I

Instituto de Computação - UFF 13

OpenGL:OpenGL: exemplos de aplicações exemplos de aplicações

#include <whateverYouNeed.h>main() { InitializeAWindowPlease(); /* Chama rotinas para criação e gerenciamento da

janela de interface (não faz parte da OpenGL) */    glClearColor(0.0, 0.0, 0.0, 0.0); /* Seleciona a cor negra para limpar a janela */ glClear(GL_COLOR_BUFFER_BIT); /* Limpa o buffer de cor com a cor estabelecida */    glColor3f(1.0, 1.0, 1.0); /* Escolhe a cor branca para desenhar as primitivas */

   glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); /* Estabelece o sistema de coordenadas e a forma

como a imagem é mapeada na janela */     glBegin(GL_POLYGON); /* Inicia o desenho da primitiva poligono */    glVertex2f(-0.5, -0.5); /* Primeiro vertice */    glVertex2f(-0.5, 0.5);     glVertex2f(0.5, 0.5);    glVertex2f(0.5, -0.5); /* Ultimo vertice */    glEnd(); /* Encerra desenho da primitiva */    glFlush();

   UpdateTheWindowAndCheckForEvents(); /* gerencia o conteúdo da janela e processa eventos */ }

Page 14: Computação Gráfica I

Instituto de Computação - UFF 14

OpenGL:OpenGL: resultado resultado

Page 15: Computação Gráfica I

Instituto de Computação - UFF 15

OpenGL:OpenGL: sintaxe dos comandos sintaxe dos comandos

• Todos os comandos começam com o prefixo Todos os comandos começam com o prefixo gl gl (Ex.: (Ex.: glglClearColor).ClearColor).

• As palavras nos nome dos comandos começam com As palavras nos nome dos comandos começam com letras maiúsculas (Ex.: glletras maiúsculas (Ex.: glColorColor()).()).

• O sufixo indica o número e o tipo dos argumentos O sufixo indica o número e o tipo dos argumentos (Ex.: glVertex(Ex.: glVertex2i2i(1,3)).(1,3)).

• As constantes começam com As constantes começam com GL_GL_ (Ex.: (Ex.: GL_GL_COLOR_BUFFER_BIT).COLOR_BUFFER_BIT).

Page 16: Computação Gráfica I

Instituto de Computação - UFF 16

OpenGL:OpenGL: sintaxe dos comandos sintaxe dos comandos

• Todos os comandos começam com o sufixo Todos os comandos começam com o sufixo gl gl (Ex.: (Ex.: glglClearColor).ClearColor).

• As palavras nos nome dos comandos começam com As palavras nos nome dos comandos começam com letras maiúsculas (Ex.: glletras maiúsculas (Ex.: glColorColor()).()).

• O sufixo indica o número e o tipo dos argumentos O sufixo indica o número e o tipo dos argumentos (Ex.: glVertex(Ex.: glVertex2i2i(1,3)).(1,3)).

• As constantes começam com As constantes começam com GL_GL_ (Ex.: (Ex.: GL_GL_COLOR_BUFFER_BIT).COLOR_BUFFER_BIT).

Page 17: Computação Gráfica I

Instituto de Computação - UFF 17

OpenGL:OpenGL: sintaxe dos comandos sintaxe dos comandos

glVertex3fv( glVertex3fv( vv ) )

Número deNúmero decomponentescomponentes2 - (x,y) 2 - (x,y) 3 - (x,y,z)3 - (x,y,z)4 - (x,y,z,w)4 - (x,y,z,w)

Tipo de dadoTipo de dadob - byteb - byteub - unsigned byteub - unsigned bytes - shorts - shortus - unsigned shortus - unsigned shorti - inti - intui - unsigned intui - unsigned intf - floatf - floatd - doubled - double

vetorvetoromita o “v” qdoomita o “v” qdo

coords dadas uma a umacoords dadas uma a uma

glVertex2f( x, y )glVertex2f( x, y )

Page 18: Computação Gráfica I

Instituto de Computação - UFF 18

OpenGL:OpenGL: sufixo e tipo dos argumentos sufixo e tipo dos argumentos

SufixoSufixo TipoTipo CC OpenGLOpenGL

bb Inteiro 8-bitsInteiro 8-bits signed charsigned char GLbyteGLbyte

ss Inteiro 16-bitsInteiro 16-bits shortshort GLshortGLshort

ii Inteiro 32-bitsInteiro 32-bits longlong GLint, GLsizei GLint, GLsizei

ff Ponto-flutuante 32-bitPonto-flutuante 32-bit floatfloat GLfloat, GLclampf GLfloat, GLclampf

dd Ponto-flutuante 64-bitPonto-flutuante 64-bit doubledouble GLdouble, GLclampd GLdouble, GLclampd

ubub Caractere s/ sinal 8-bitCaractere s/ sinal 8-bit unsigned char unsigned char GLubyte, GLboolean GLubyte, GLboolean

usus Caractere s/ sinal 16-bitCaractere s/ sinal 16-bit unsigned shortunsigned short GLushort GLushort

uiui Caractere s /sinal 32-bitCaractere s /sinal 32-bit unsigned longunsigned long GLuint, GLenum, GLbitfield GLuint, GLenum, GLbitfield

Page 19: Computação Gráfica I

Instituto de Computação - UFF 19

OpenGL:OpenGL: máquina de estados máquina de estados

• A OpenGL funciona como uma A OpenGL funciona como uma máquina de estadosmáquina de estados..

• Os estados correntes permanecem ativos até que Os estados correntes permanecem ativos até que sejam modificados.sejam modificados.

• Exemplo: a cor de desenho corrente é aplicada a Exemplo: a cor de desenho corrente é aplicada a qualquer primitiva geométrica até que seja qualquer primitiva geométrica até que seja modificada.modificada.

Page 20: Computação Gráfica I

Instituto de Computação - UFF 20

OpenGL:OpenGL: máquina de estados máquina de estados

• Existem vários estados:Existem vários estados:

– Cor de desenho corrente.Cor de desenho corrente.– Transformações de visualização e projeção.Transformações de visualização e projeção.– Padrões de linhas e polígonos.Padrões de linhas e polígonos.– Modo de desenho dos polígonos.Modo de desenho dos polígonos.– Posição e característica das fontes de luz.Posição e característica das fontes de luz.– Propriedades dos materiais associados aos objetos.Propriedades dos materiais associados aos objetos.– etc.etc.

Page 21: Computação Gráfica I

Instituto de Computação - UFF 21

OpenGL:OpenGL: máquina de estados máquina de estados

• Vários estados se referem a modos que estão Vários estados se referem a modos que estão habilitados ou desabilitados.habilitados ou desabilitados.

• Estes estados são modificados através dos Estes estados são modificados através dos comandos:comandos:

– glEnable() e glDisable().glEnable() e glDisable().– Exemplo: glEnable(GL_LIGHTINING).Exemplo: glEnable(GL_LIGHTINING).

Page 22: Computação Gráfica I

Instituto de Computação - UFF 22

OpenGL:OpenGL: máquina de estados máquina de estados

• Alguns comandos para ler um estado:Alguns comandos para ler um estado:– glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetBooleanv(), glGetDoublev(), glGetFloatv(),

glGetIntegerv(), glPointerv() ou glIsEnabled().glGetIntegerv(), glPointerv() ou glIsEnabled().

• Comandos para salvar um estado:Comandos para salvar um estado:– glPushAttrib() e glPushClientAttrib().glPushAttrib() e glPushClientAttrib().

• Comandos para restaurar um estado:Comandos para restaurar um estado:– glPopAttrib() e glPopClientAttrib().glPopAttrib() e glPopClientAttrib().

Page 23: Computação Gráfica I

Instituto de Computação - UFF 23

OpenGL:OpenGL: API’s relacionadas API’s relacionadas

• GLUGLU (OpenGL Utility Library) (OpenGL Utility Library)– Parte do padrão OpenGL.Parte do padrão OpenGL.– NURBS, trianguladores, quádricas, etc.NURBS, trianguladores, quádricas, etc.

• AGL, GLX, WGLAGL, GLX, WGL– Camadas entre o OpenGL os diversos sistemas de janelas.Camadas entre o OpenGL os diversos sistemas de janelas.

• GLUTGLUT (OpenGL Utility Toolkit) (OpenGL Utility Toolkit)– API portátil de acesso aos sistemas de janelas.API portátil de acesso aos sistemas de janelas.– Encapsula e esconde as camadas proprietárias.Encapsula e esconde as camadas proprietárias.– Não é parte official do OpenGL.Não é parte official do OpenGL.

Page 24: Computação Gráfica I

Instituto de Computação - UFF 24

OpenGL:OpenGL: GLUT GLUT

• Biblioteca para criação de interfaces gráficas Biblioteca para criação de interfaces gráficas simples para programas gráficos baseados simples para programas gráficos baseados em OpenGL.em OpenGL.

• Fornece um conjunto de primitivas para Fornece um conjunto de primitivas para desenho de objetos mais complexos como desenho de objetos mais complexos como quádricas e etc.quádricas e etc.

Page 25: Computação Gráfica I

Instituto de Computação - UFF 25

OpenGL:OpenGL: como utilizar a OpenGL e GLUT como utilizar a OpenGL e GLUT em código C/C++em código C/C++

• #include <GL/glut.h>#include <GL/glut.h>– Já inclui automaticamente os headers do OpenGL:Já inclui automaticamente os headers do OpenGL:

• #include <GL/gl.h>#include <GL/gl.h>• #include <GL/glu.h>#include <GL/glu.h>

• Se GLUT não for usado, os headers OpenGL têm que ser Se GLUT não for usado, os headers OpenGL têm que ser incluídos explicitamente, junto com os de outra camada de incluídos explicitamente, junto com os de outra camada de interface.interface.

• Há APIs para construção de interfaces gráficas (GUI) Há APIs para construção de interfaces gráficas (GUI) construídas sobre o GLUT cujos headers incluem os do GLUT.construídas sobre o GLUT cujos headers incluem os do GLUT.– Por exemplo, o pacote GLUI requer:Por exemplo, o pacote GLUI requer:

• #include <GL/glui.h>#include <GL/glui.h>• (Já inclui glut.h)(Já inclui glut.h)

Page 26: Computação Gráfica I

Instituto de Computação - UFF 26

OpenGL:OpenGL: como utilizar a OpenGL e GLUT como utilizar a OpenGL e GLUT em código C/C++em código C/C++

• #include <GL/glut.h>#include <GL/glut.h>– Já inclui automaticamente os headers do OpenGL:Já inclui automaticamente os headers do OpenGL:

• #include <GL/gl.h>#include <GL/gl.h>• #include <GL/glu.h>#include <GL/glu.h>

• Se GLUT não for usado, os headers OpenGL têm que ser Se GLUT não for usado, os headers OpenGL têm que ser incluídos explicitamente, junto com os de outra camada de incluídos explicitamente, junto com os de outra camada de interface.interface.

• Há APIs para construção de interfaces gráficas (GUI) Há APIs para construção de interfaces gráficas (GUI) construídas sobre o GLUT cujos headers incluem os do GLUT.construídas sobre o GLUT cujos headers incluem os do GLUT.– Por exemplo, o pacote GLUI requer:Por exemplo, o pacote GLUI requer:

• #include <GL/glui.h>#include <GL/glui.h>• (Já inclui glut.h)(Já inclui glut.h)

Page 27: Computação Gráfica I

Instituto de Computação - UFF 27

OpenGL:OpenGL: programação por eventos - programação por eventos - callbackscallbacks

• CallbacksCallbacks são rotinas que serão chamadas para são rotinas que serão chamadas para tratar tratar eventoseventos. .

• Para uma rotina callback ser efetivamente chamada Para uma rotina callback ser efetivamente chamada ela precisa ser registrada através da função.ela precisa ser registrada através da função.– glutXxxFunc (glutXxxFunc (callbackcallback))– Onde Xxx designa uma classe de eventos e Onde Xxx designa uma classe de eventos e callbackcallback é o é o

nome da rotina.nome da rotina.

• Por exemplo, para registrar uma callback de desenho Por exemplo, para registrar uma callback de desenho chamada chamada DesenhoDesenho, usa-se, usa-se– glutDisplayFunc (Desenho);glutDisplayFunc (Desenho);

Page 28: Computação Gráfica I

Instituto de Computação - UFF 28

OpenGL:OpenGL: programação por eventos – programação por eventos – callback de redesenhocallback de redesenho

• É a rotina chamada automaticamente sempre que a É a rotina chamada automaticamente sempre que a janela ou parte dela precisa ser redesenhada (ex.: janela ou parte dela precisa ser redesenhada (ex.: janela estava obscurecida por outra que foi fechada)janela estava obscurecida por outra que foi fechada)

• Todo programa GLUT precisa ter uma! Exemplo:Todo programa GLUT precisa ter uma! Exemplo:

void display ( void ){ glClear( GL_COLOR_BUFFER_BIT ); glBegin( GL_TRIANGLE_STRIP ); glVertex3fv( v[0] ); glVertex3fv( v[1] ); glVertex3fv( v[2] ); glVertex3fv( v[3] ); glEnd(); glutSwapBuffers(); /* Usamos double-buffering! */}

Page 29: Computação Gráfica I

Instituto de Computação - UFF 29

OpenGL:OpenGL: programação por eventos – programação por eventos – callback de redimensionamentocallback de redimensionamento

– glutReshapeFunc (Reshape);glutReshapeFunc (Reshape);• Chamada sempre que a janela é redimensionada, isto é, teve seu Chamada sempre que a janela é redimensionada, isto é, teve seu

tamanho alterado.tamanho alterado.• Tem a formaTem a forma

– void reshape (int width, int height){...}void reshape (int width, int height){...}– width/height são a nova largura/altura da janela (em pixels)width/height são a nova largura/altura da janela (em pixels)

• Obs: Se uma rotina de redimensionamento não for especificada, Obs: Se uma rotina de redimensionamento não for especificada, o GLUT usa uma rotina de redimensionamento “default” que o GLUT usa uma rotina de redimensionamento “default” que simplesmente ajusta o simplesmente ajusta o viewportviewport para usar toda a área da janela. para usar toda a área da janela.

Page 30: Computação Gráfica I

Instituto de Computação - UFF 30

OpenGL:OpenGL: programação por eventos – programação por eventos – outras callbacksoutras callbacks

• Outras callbacks comumente usadasOutras callbacks comumente usadas– Eventos de tecladoEventos de teclado

• void keyboard(unsigned char key, int x, int y)void keyboard(unsigned char key, int x, int y)

– Eventos de mouseEventos de mouse• void mouse(int button,int state,int x,int y)void mouse(int button,int state,int x,int y)• void motion(int x, int y) void motion(int x, int y) • void passiveMotion(int x, int y)void passiveMotion(int x, int y)

– Chamada continuamente quando nenhum outro Chamada continuamente quando nenhum outro evento ocorreevento ocorre

• void idle(void)void idle(void)

Page 31: Computação Gráfica I

Instituto de Computação - UFF 31

OpenGL:OpenGL: programação por eventos – programação por eventos – outras callbacksoutras callbacks

• Inicialização do GLUTInicialização do GLUT

– glutInit (int* argc, char** argv)glutInit (int* argc, char** argv)

• Estabelece contato com sistema de janelas.Estabelece contato com sistema de janelas.• Em X, opções de linha de comando são processadas e Em X, opções de linha de comando são processadas e

removidas.removidas.

Page 32: Computação Gráfica I

Instituto de Computação - UFF 32

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

• Inicialização da(s) janela(s)Inicialização da(s) janela(s)

– glutInitDisplayMode (int glutInitDisplayMode (int modomodo))

• Estabelece o tipo de recursos necessários para as janelas Estabelece o tipo de recursos necessários para as janelas que serão criadas. que serão criadas. ModoModo é um “ou” bit-a-bit de constantes: é um “ou” bit-a-bit de constantes:

– GLUT_RGB cores dos pixels serão expressos em RGB.GLUT_RGB cores dos pixels serão expressos em RGB.– GLUT_DOUBLE bufferização dupla (ao invés de simples).GLUT_DOUBLE bufferização dupla (ao invés de simples).– GLUT_DEPTHGLUT_DEPTH buffer de profundidade (z-buffer). buffer de profundidade (z-buffer).– GLUT_ACCUM GLUT_ACCUM buffer de acumulação.buffer de acumulação.– GLUT_ALPHAGLUT_ALPHA buffer de cores terá componente alfa. buffer de cores terá componente alfa.

Page 33: Computação Gráfica I

Instituto de Computação - UFF 33

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

• Inicialização da(s) janela(s)Inicialização da(s) janela(s)

– glutInitDisplayMode (int glutInitDisplayMode (int modomodo))

• Estabelece o tipo de recursos necessários para as janelas Estabelece o tipo de recursos necessários para as janelas que serão criadas. que serão criadas. ModoModo é um “ou” bit-a-bit de constantes: é um “ou” bit-a-bit de constantes:

– GLUT_RGB cores dos pixels serão expressos em RGB.GLUT_RGB cores dos pixels serão expressos em RGB.– GLUT_DOUBLE bufferização dupla (ao invés de simples).GLUT_DOUBLE bufferização dupla (ao invés de simples).– GLUT_DEPTHGLUT_DEPTH buffer de profundidade (z-buffer). buffer de profundidade (z-buffer).– GLUT_ACCUM GLUT_ACCUM buffer de acumulação.buffer de acumulação.– GLUT_ALPHAGLUT_ALPHA buffer de cores terá componente alfa. buffer de cores terá componente alfa.

Page 34: Computação Gráfica I

Instituto de Computação - UFF 34

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

– glutInitWindowPosition (int x, int y)glutInitWindowPosition (int x, int y)• Estabelece a posição inicial do canto superior Estabelece a posição inicial do canto superior

esquerdo da janela a ser criada.esquerdo da janela a ser criada.

– glutInitWindowSize (int width, height)glutInitWindowSize (int width, height)• Estabelece o tamanho (em pixels) da janela a Estabelece o tamanho (em pixels) da janela a

ser criada.ser criada.

Page 35: Computação Gráfica I

Instituto de Computação - UFF 35

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

• Criação da(s) janela(s)Criação da(s) janela(s)

– int glutCreateWindow (char* int glutCreateWindow (char* nomenome))

• Cria uma nova janela primária (Cria uma nova janela primária (top-leveltop-level))• Nome é tipicamente usado para rotular a janelaNome é tipicamente usado para rotular a janela• O número inteiro retornado é usado pelo GLUT para O número inteiro retornado é usado pelo GLUT para

identificar a janelaidentificar a janela

Page 36: Computação Gráfica I

Instituto de Computação - UFF 36

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

• Outras inicializaçõesOutras inicializações

– Após a criação da janela é costumeiro configurar Após a criação da janela é costumeiro configurar variáveis de estado do OpenGL que não mudarão variáveis de estado do OpenGL que não mudarão no decorrer do programa. Por exemplo:no decorrer do programa. Por exemplo:

• Cor do fundoCor do fundo• Tipo de sombreamento desejadoTipo de sombreamento desejado

Page 37: Computação Gráfica I

Instituto de Computação - UFF 37

OpenGL:OpenGL: programação por eventos – programação por eventos – inicializaçãoinicialização

• Depois de registradas as callbacks, o controle Depois de registradas as callbacks, o controle é entregue ao sistema de janelas:é entregue ao sistema de janelas:– glutMainDisplayLoop (void)glutMainDisplayLoop (void)

• Esta rotina na verdade é o “despachante” de Esta rotina na verdade é o “despachante” de eventos.eventos.

• Ela nunca retorna.Ela nunca retorna.

Page 38: Computação Gráfica I

Instituto de Computação - UFF 38

OpenGL:OpenGL: exemplo do livro vermelho exemplo do livro vermelho

void init (void) { /* selecionar cor de fundo (preto) */ glClearColor (0.0, 0.0, 0.0, 0.0);

/* inicializar sistema de viz. */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);}

int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE

| GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutMainLoop(); return 0;}

Page 39: Computação Gráfica I

Instituto de Computação - UFF 39

OpenGL:OpenGL: primitivas de desenho primitivas de desenho

• glBegin ( PRIMITIVA );glBegin ( PRIMITIVA );• especificação de vértices, cores, coordenadas de textura, especificação de vértices, cores, coordenadas de textura,

propriedades de materialpropriedades de material

• glEnd ();glEnd ();

• Entre Entre glBegin()glBegin() e e glEnd()glEnd() apenas alguns comandos apenas alguns comandos podem ser usados. Ex.:podem ser usados. Ex.:– glMaterialglMaterial– glNormalglNormal– glTexCoordglTexCoord

Page 40: Computação Gráfica I

Instituto de Computação - UFF 40

OpenGL:OpenGL: primitivas de desenho primitivas de desenho

• glBegin ( PRIMITIVA );glBegin ( PRIMITIVA );• especificação de vértices, cores, coordenadas de textura, especificação de vértices, cores, coordenadas de textura,

propriedades de materialpropriedades de material

• glEnd ();glEnd ();

• Entre Entre glBegin()glBegin() e e glEnd()glEnd() apenas alguns comandos apenas alguns comandos podem ser usados. Ex.:podem ser usados. Ex.:– glMaterialglMaterial– glNormalglNormal– glTexCoordglTexCoord

Page 41: Computação Gráfica I

Instituto de Computação - UFF 41

OpenGL:OpenGL: primitivas de desenho primitivas de desenho

• Uma vez emitido um vértice (glVertex), este é Uma vez emitido um vértice (glVertex), este é desenhado com as propriedades (cor, desenhado com as propriedades (cor, material, normal, coordenadas de textura etc) material, normal, coordenadas de textura etc) registradas nas variáveis de estado registradas nas variáveis de estado correspondentes.correspondentes.

• Conclusão: Antes de emitir um vértice, Conclusão: Antes de emitir um vértice, assegurar-se que cor, material, normal e etc, assegurar-se que cor, material, normal e etc, têm o valor certo.têm o valor certo.

Page 42: Computação Gráfica I

Instituto de Computação - UFF 42

OpenGL:OpenGL: primitivas de desenho primitivas de desenho

ValorValor SignificadoSignificado

GL_POINTSGL_POINTS Pontos individuaisPontos individuais

GL_LINESGL_LINES Pares de vértices interpretados como segmentos de reta Pares de vértices interpretados como segmentos de reta individuais.individuais.

GL_LINE_STRIPGL_LINE_STRIP Serie de segmentos de reta conectados.Serie de segmentos de reta conectados.

GL_LINE_LOOPGL_LINE_LOOP Igual ao anterior. Ultimo vertice conectado a primeiroIgual ao anterior. Ultimo vertice conectado a primeiro

GL_TRIANGLESGL_TRIANGLES Triplas de vértices interpretados como triângulos.Triplas de vértices interpretados como triângulos.

GL_TRIANGLE_STRIPGL_TRIANGLE_STRIP Cadeia triângulos conectados.Cadeia triângulos conectados.

GL_TRIANGLE_FANGL_TRIANGLE_FAN Leque de triângulos conectados.Leque de triângulos conectados.

GL_QUADSGL_QUADS Quadrupla de vértices interpretados como quadriláteros.Quadrupla de vértices interpretados como quadriláteros.

GL_QUAD_STRIPGL_QUAD_STRIP Cadeia de quadriláteros conectados.Cadeia de quadriláteros conectados.

GL_POLYGONGL_POLYGON Borda de um polígono convexo simples.Borda de um polígono convexo simples.

Page 43: Computação Gráfica I

Instituto de Computação - UFF 43

OpenGL:OpenGL: primitivas de desenho primitivas de desenho

Page 44: Computação Gráfica I

Instituto de Computação - UFF 44

OpenGL:OpenGL: programação de hardware programação de hardware gráficográfico

• Uma característica fundamental do hardware Uma característica fundamental do hardware gráfico moderno é sua programabilidade.gráfico moderno é sua programabilidade.

• Através da programação customizada é Através da programação customizada é possível produzir efeitos mais sofisticados de possível produzir efeitos mais sofisticados de iluminação e texturas.iluminação e texturas.

• Com efeito, é possível obter resultados Com efeito, é possível obter resultados impossíveis de serem atingidos por meio da impossíveis de serem atingidos por meio da programação convencional.programação convencional.

Page 45: Computação Gráfica I

Instituto de Computação - UFF 45

OpenGL:OpenGL: programação de hardware programação de hardware gráficográfico

• As placas gráficas já são programáveis a alguns As placas gráficas já são programáveis a alguns anos.anos.

• Entretanto, tal processo só tornou-se acessível Entretanto, tal processo só tornou-se acessível de fato com as linguagens de programção de de fato com as linguagens de programção de tonalização em alto nível ou tonalização em alto nível ou shading languagesshading languages..

Page 46: Computação Gráfica I

Instituto de Computação - UFF 46

OpenGL:OpenGL: linguagens de tonalização ou linguagens de tonalização ou shading languagesshading languages

• Linguagens de tonalização servem para se determinar o Linguagens de tonalização servem para se determinar o aparência em uma superfície ou objeto.aparência em uma superfície ou objeto.

• Podem ser considerados os seguintes fatores:Podem ser considerados os seguintes fatores:

– Absorção/difusão da luzAbsorção/difusão da luz– Geração de sombrasGeração de sombras– Mapeamento de texturasMapeamento de texturas– Efeitos ópticos: reflexão e refraçãoEfeitos ópticos: reflexão e refração– Perturbações na superfície: Perturbações na superfície: bump mappingbump mapping– Efeitos de pós-processamentoEfeitos de pós-processamento

• Programas escritos nestas linguagens são denominados Programas escritos nestas linguagens são denominados shadersshaders..

Page 47: Computação Gráfica I

Instituto de Computação - UFF 47

OpenGL:OpenGL: linguagens de tonalização ou linguagens de tonalização ou shading languagesshading languages

• Exemplo mais conhecido de shading language: Exemplo mais conhecido de shading language: Renderman (Pixar 1988).Renderman (Pixar 1988).

• A Renderman era voltada para geração de imagens A Renderman era voltada para geração de imagens com altíssimo nível de realismo.com altíssimo nível de realismo.

• Ainda é amplamente utilizada pela indústria do Ainda é amplamente utilizada pela indústria do cinema.cinema.

• Não é uma linguagem para geração de imagens em Não é uma linguagem para geração de imagens em tempo real.tempo real.

Page 48: Computação Gráfica I

Instituto de Computação - UFF 48

OpenGL:OpenGL: linguagens de tonalização ou linguagens de tonalização ou shading languagesshading languages

• Programas escritos em linguagens de tonalização em Programas escritos em linguagens de tonalização em tempo real tempo real precisam executar no hardware gráfico.precisam executar no hardware gráfico.

• Exemplos de shading languages:Exemplos de shading languages:– Cg – Fernando, 2003 – requer a instalação e configuração de Cg – Fernando, 2003 – requer a instalação e configuração de

um kit.um kit.

– HLSL – Engel , 2003 – presente somente no ambiente HLSL – Engel , 2003 – presente somente no ambiente Windows, pois é integrada ao DirectX.Windows, pois é integrada ao DirectX.

– OpenGL Shading Language – integrada na API versão 2.0 da OpenGL Shading Language – integrada na API versão 2.0 da biblioteca OpenGL.biblioteca OpenGL.

Page 49: Computação Gráfica I

Instituto de Computação - UFF 49

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável• Para entender o funcionamento dos shaders é Para entender o funcionamento dos shaders é

necessário primeiramente ter uma visão clara do necessário primeiramente ter uma visão clara do funcionamento do pipeline de renderingfuncionamento do pipeline de rendering

• Abaixo mostramos um versão simplificada do Abaixo mostramos um versão simplificada do pipeline convencionalpipeline convencional

Transformaçãoe iluminação

Montagem de primitivas e conversão matricial

Operações raster

Texturização e colorização de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 50: Computação Gráfica I

Instituto de Computação - UFF 50

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável

• O diagrama representa o caminho de um único polígono.O diagrama representa o caminho de um único polígono.

• O programa faz chamadas às funções da OpenGL e com O programa faz chamadas às funções da OpenGL e com isso um conjunto de informações para os vértices são isso um conjunto de informações para os vértices são geradas: coordenadas, coordenadas de textura, vetor geradas: coordenadas, coordenadas de textura, vetor normal.normal.

Transformaçãoe iluminação

Montagem de primitivas e conversão matricial

Operações raster

Texturização e colorização de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 51: Computação Gráfica I

Instituto de Computação - UFF 51

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável

• Na primeira etapa são aplicadas as transformações Na primeira etapa são aplicadas as transformações geométricas que convertem as coordenadas do objeto para geométricas que convertem as coordenadas do objeto para coordenadas da câmera e aplica-se a projeção especificada. coordenadas da câmera e aplica-se a projeção especificada.

• Isto corresponde a transformação do vértice por meio de sua Isto corresponde a transformação do vértice por meio de sua multiplicação pelas matrizes modelview e projection.multiplicação pelas matrizes modelview e projection.

Transformaçãoe iluminação

Montagem de primitivas e conversão matricial

Operações raster

Texturização e colorização de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 52: Computação Gráfica I

Instituto de Computação - UFF 52

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável• Na segunda etapa é montada a primitiva conforme especificada pelo Na segunda etapa é montada a primitiva conforme especificada pelo

usuário. A etapa anterior não dispões de tal informação.usuário. A etapa anterior não dispões de tal informação.

• Em seguida é feita a conversão matricial, onde são determinadas as Em seguida é feita a conversão matricial, onde são determinadas as coordenadas dos fragmentos que compõem a primitiva.coordenadas dos fragmentos que compõem a primitiva.

• Nesta etapa são determinados os valores (cor, coordenada de Nesta etapa são determinados os valores (cor, coordenada de textura, profundidade de cada fragmento através de interpolação).textura, profundidade de cada fragmento através de interpolação).

Transformaçãoe iluminação

Montagem de primitivas e conversão matricial

Operações raster

Texturização e colorização de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 53: Computação Gráfica I

Instituto de Computação - UFF 53

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável• Na terceira etapa as informações calculadas para cada Na terceira etapa as informações calculadas para cada

fragmento podem ser modificadas em função do mapeamento fragmento podem ser modificadas em função do mapeamento de textura e aplicação de neblina (fog).de textura e aplicação de neblina (fog).

• Finalmente as operações raster determinam se um fragmento Finalmente as operações raster determinam se um fragmento efetivamente chegará à tela ou não sendo aplicados testes de efetivamente chegará à tela ou não sendo aplicados testes de stencil, alpha e profundidade.stencil, alpha e profundidade.

Transformaçãoe iluminação

Montagem de primitivas e conversão matricial

Operações raster

Texturização e colorização de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 54: Computação Gráfica I

Instituto de Computação - UFF 54

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável• As etapas de transformação + iluminação são substituidas por um As etapas de transformação + iluminação são substituidas por um

processador de vértices que executa programas de vértice (vertex processador de vértices que executa programas de vértice (vertex shader).shader).

• As etapas de texturização + colorização de fragmentos são As etapas de texturização + colorização de fragmentos são substituidas por um processador de fragmentos que executa substituidas por um processador de fragmentos que executa programas de fragmento (fragment shader).programas de fragmento (fragment shader).

Processador de vértices

Montagem de primitivas e conversão matricial

Operações raster

Processador de fragmentos

vértices

fragmentos

vértices

Tipo de primitiva

Page 55: Computação Gráfica I

Instituto de Computação - UFF 55

OpenGL:OpenGL: pipeline convencional vs pipeline convencional vs pipeline programávelpipeline programável• Os programas de vértice e fragmentos são compostos de instruções Os programas de vértice e fragmentos são compostos de instruções

de máquina que o processador gráfico consegue executar de máquina que o processador gráfico consegue executar diretamente.diretamente.

• Na prática existem várias unidades de hardware para vértices e Na prática existem várias unidades de hardware para vértices e fragmentos capazes de executar instruções em paralelo fragmentos capazes de executar instruções em paralelo eficientemente.eficientemente.

• Por este motiva é comum considerar os modernos processadores Por este motiva é comum considerar os modernos processadores gráficos atuais como um certo tipo de máquina SIMD.gráficos atuais como um certo tipo de máquina SIMD.

• É possível, entretanto implementar tais programas em linguagens de É possível, entretanto implementar tais programas em linguagens de alto nível o que requer a utilização de um compilador capaz de alto nível o que requer a utilização de um compilador capaz de transformar o código fonte em código objeto.transformar o código fonte em código objeto.

Page 56: Computação Gráfica I

Instituto de Computação - UFF 56

OpenGL:OpenGL: OpenGL Shading Language OpenGL Shading Language

• Apresentada primeiramente como uma extensão ARB (Architecture Apresentada primeiramente como uma extensão ARB (Architecture Review Board 2003).Review Board 2003).

• Tornou-se parte integrante da biblioteca OpenGL a partir da versão Tornou-se parte integrante da biblioteca OpenGL a partir da versão 2.0.2.0.

• Muito semelhante a linguagem C.Muito semelhante a linguagem C.

• Apesar de possuir sintaxe semelhante, possui diferenças e restrições Apesar de possuir sintaxe semelhante, possui diferenças e restrições consideráveis em relação à linguagem C.consideráveis em relação à linguagem C.

• Tais restrições se devem ao tipo de tarefa a que foi destinada e a Tais restrições se devem ao tipo de tarefa a que foi destinada e a limitação dos dispositivos gráficos.limitação dos dispositivos gráficos.

Page 57: Computação Gráfica I

Instituto de Computação - UFF 57

OpenGL:OpenGL: OpenGL Shading Language OpenGL Shading Language

• A arquitetura dos dispositivos mais recentes eliminou parte destas A arquitetura dos dispositivos mais recentes eliminou parte destas restrições juntamente com o surgimento de linguagens apropriadas restrições juntamente com o surgimento de linguagens apropriadas para tais arquiteturas.para tais arquiteturas.

• Exemplos são as arquiteturas/plataformas propostas pela NVidia Exemplos são as arquiteturas/plataformas propostas pela NVidia CUDA – Compute Unified Device Architecture) e ATI-AMD (CAL – CUDA – Compute Unified Device Architecture) e ATI-AMD (CAL – Compute Abstraction Layer )Compute Abstraction Layer )

• Nestas arquiteturas é possível desenvolver aplicações de propósito Nestas arquiteturas é possível desenvolver aplicações de propósito geral sem as idiossincrasias das linguagens de tonalização.geral sem as idiossincrasias das linguagens de tonalização.

• Entretanto tanto CUDA quanto CAL adotam um modelo de Entretanto tanto CUDA quanto CAL adotam um modelo de programação completamente distinto do utilizado convencionalmente.programação completamente distinto do utilizado convencionalmente.

Page 58: Computação Gráfica I

Instituto de Computação - UFF 58

OpenGL:OpenGL: Tipos de dados Tipos de dados

• A GLSL suporta tipos de dados vetoriais já que foi A GLSL suporta tipos de dados vetoriais já que foi criada para geração de efeitos de tonalização e criada para geração de efeitos de tonalização e cálculo de illuminação.cálculo de illuminação.

• A vantagem em se utilizar tipos vetoriais é a de que A vantagem em se utilizar tipos vetoriais é a de que o hardware é capaz de realizar operações sobre o hardware é capaz de realizar operações sobre eles com muito mais eficiência do que sobre tipos eles com muito mais eficiência do que sobre tipos escalares.escalares.

Page 59: Computação Gráfica I

Instituto de Computação - UFF 59

OpenGL:OpenGL: Tipos de dados Tipos de dados

• Tipos fundamentais:Tipos fundamentais:

TiposTipos DescriçãoDescrição

voidvoid Tipo nulo empregado em funções que não retornam valoresTipo nulo empregado em funções que não retornam valores

vec2, vec3, vec4vec2, vec3, vec4 Vetores Vetores floatfloat de 2, 3 e 4 componentes de 2, 3 e 4 componentes

mat2, mat3, mat4mat2, mat3, mat4 Matrizes Matrizes floatfloat 2x2, 3x3 e 4x4 2x2, 3x3 e 4x4

bool, int, floatbool, int, float Tipos escalares comunsTipos escalares comuns

sampler1D, sampler2D, sampler1D, sampler2D, sampler3Dsampler3D

Utilizados para acessar texturas 1D, 2D, 3D e cubemapsUtilizados para acessar texturas 1D, 2D, 3D e cubemaps

sampler1Dshadow, sampler1Dshadow, sampler2Dshadowsampler2Dshadow

Utilizados para acessar texturas 1D e 2D contendo valores de Utilizados para acessar texturas 1D e 2D contendo valores de profundidade para cálculo de sombras.profundidade para cálculo de sombras.

Page 60: Computação Gráfica I

Instituto de Computação - UFF 60

OpenGL:OpenGL: Tipos de dados Tipos de dados

• Os tipos mais comuns são baseados em valores Os tipos mais comuns são baseados em valores reais.reais.

• Por outro lado, existem variações como inteiros Por outro lado, existem variações como inteiros (ivec2, ivec3, ivec4) e booleano (bvec2, bvec3 e (ivec2, ivec3, ivec4) e booleano (bvec2, bvec3 e bvec4).bvec4).

• O usuário pode criar vetores de qualquer tamanho O usuário pode criar vetores de qualquer tamanho como em C com a restrição de que eles sejam como em C com a restrição de que eles sejam unidimensionais. unidimensionais.

Page 61: Computação Gráfica I

Instituto de Computação - UFF 61

OpenGL:OpenGL: Tipos de dados Tipos de dados

• Não existe tipo char nem strings.Não existe tipo char nem strings.

• Não existem ponteiros.Não existem ponteiros.

• Não é possível alocar vetores dinâmicamente.Não é possível alocar vetores dinâmicamente.

Page 62: Computação Gráfica I

Instituto de Computação - UFF 62

OpenGL:OpenGL: Tipos de dados Tipos de dados

• A linguagem suporta estruturas pré-definidas ou A linguagem suporta estruturas pré-definidas ou definidas pelo usuáriodefinidas pelo usuário

• Exemplo:Exemplo:struct gl_LightSourceParameters { vec4 ambient; // ambiente vec4 diffuse; // difuso vec4 specular; // especular vec4 position; // posicao vec4 halfVector; // vetor médio vec3 spotDirection; // direção se for spot float spotExponent; // expoente se for spot float spotCutoff; // ângulo de cutoff se for spot float spotCosCutoff; // cosseno do ângulo de cutoff float constantAttenuation; // fator de atenuação constante

float linearAttenuation; // fator de atenuação linear float quadraticAttenuation;// fator de atenuação quadrático }; uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];

Page 63: Computação Gráfica I

Instituto de Computação - UFF 63

OpenGL:OpenGL: Tipos de dados Tipos de dados

• Em GLSL cada variável possui um qualificador associado que Em GLSL cada variável possui um qualificador associado que indica como a variável deve ser interpretada:indica como a variável deve ser interpretada:

QualificadorQualificador DescriçãoDescriçãonenhumnenhum Variável local ou parâmetro de entrada para funçãoVariável local ou parâmetro de entrada para função

constconst Constante ou parâmetro de função somente de leitura Constante ou parâmetro de função somente de leitura

attributeattribute Define uma conexão entre o programa de vértice e a OpenGL Define uma conexão entre o programa de vértice e a OpenGL para valores que variam por vérticepara valores que variam por vértice

uniformuniform Define um valor que não é alterado durante o desenho de Define um valor que não é alterado durante o desenho de uma primitivauma primitiva

varyingvarying Define uma ligação entre a saída de um program de vértices Define uma ligação entre a saída de um program de vértices e o resultado interpolado que serve de entrada para um e o resultado interpolado que serve de entrada para um programa de fragmentosprograma de fragmentos

inin Parâmetro de entrada para uma funçãoParâmetro de entrada para uma função

outout Parâmetro de saída não inicializadoParâmetro de saída não inicializado

inoutinout Parâmetro de entrada e saídaParâmetro de entrada e saída

Page 64: Computação Gráfica I

Instituto de Computação - UFF 64

OpenGL:OpenGL: Tipos de dados Tipos de dados

• Variáveis globais (definidas fora de uma função) Variáveis globais (definidas fora de uma função) podem ter qualificadores const, attribute, uniform ou podem ter qualificadores const, attribute, uniform ou varying.varying.

• Variáveis locais só podem utilizar o quantificador Variáveis locais só podem utilizar o quantificador constconst

• Parâmetros para funções podem usar in, out ou Parâmetros para funções podem usar in, out ou inout.inout.

Page 65: Computação Gráfica I

Instituto de Computação - UFF 65

OpenGL:OpenGL: qualificador attribute qualificador attribute

• É empregado somente em programas de vértices.É empregado somente em programas de vértices.

• Serve para que este possa receber valores que variam a cada vértice.Serve para que este possa receber valores que variam a cada vértice.

• Tais valores são enviados diretamente do programa do usuário ou Tais valores são enviados diretamente do programa do usuário ou providos pela biblioteca.providos pela biblioteca.

• Exemplos:Exemplos:

attribute vec4 gl_Color;attribute vec4 gl_Color;attribute vec3 gl_Normal;attribute vec3 gl_Normal;

attribute vec4 gl_Vertex;attribute vec4 gl_Vertex;

Page 66: Computação Gráfica I

Instituto de Computação - UFF 66

OpenGL:OpenGL: qualificador uniform qualificador uniform

• Empregado tanto nos programas de vértice quanto nos programas de Empregado tanto nos programas de vértice quanto nos programas de fragmento.fragmento.

• Representam variáveis recebidas do programa do usuário ou internas Representam variáveis recebidas do programa do usuário ou internas à biblioteca cujo conteúdo não varia durante o desenho de uma à biblioteca cujo conteúdo não varia durante o desenho de uma primitiva.primitiva.

• Por exemplo: não é possível realizar transformações geométricas Por exemplo: não é possível realizar transformações geométricas entre um par glBegin ... glEnd e por esse motivo, a variável entre um par glBegin ... glEnd e por esse motivo, a variável gl_ModelviewMatrix (que contém a matriz de visualização) é definida gl_ModelviewMatrix (que contém a matriz de visualização) é definida como uniform.como uniform.

uniform mat3 gl_ModelviewMatrix;uniform mat3 gl_ModelviewMatrix;

Page 67: Computação Gráfica I

Instituto de Computação - UFF 67

OpenGL:OpenGL: qualificador varying qualificador varying

• Tem como função criar uma ligação entre uma variável no programa Tem como função criar uma ligação entre uma variável no programa de vértice e a mesma no programa de fragmento.de vértice e a mesma no programa de fragmento.

• Variáveis declaradas como varying têm seu conteúdo interpolado pela Variáveis declaradas como varying têm seu conteúdo interpolado pela etapa de conversão matricial.etapa de conversão matricial.

• Desta forma, o programa de fragmento recebe o valor específico para Desta forma, o programa de fragmento recebe o valor específico para o fragmento em questão e não a saída do programa de vértice.o fragmento em questão e não a saída do programa de vértice.

Page 68: Computação Gráfica I

Instituto de Computação - UFF 68

OpenGL:OpenGL: operadores especiais operadores especiais

• GLSL suporta a maior parte dos operadores definidos para a GLSL suporta a maior parte dos operadores definidos para a linguagem C.linguagem C.

• Existem entretanto exceções e operadores adicionais tais como;Existem entretanto exceções e operadores adicionais tais como;

• operadores de atribuição especiais;operadores de atribuição especiais;• operadores de swizzling;operadores de swizzling;• operadores vetoriais.operadores vetoriais.

Page 69: Computação Gráfica I

Instituto de Computação - UFF 69

OpenGL:OpenGL: operadores de atribuição operadores de atribuição

• Considere as seguintes declaraçõesConsidere as seguintes declarações

float f;float f;int i;int i;vec2 v2;vec2 v2;vec3 v3;vec3 v3;vec4 v4;vec4 v4;mat2 m2mat2 m2mat3 m3;mat3 m3;

• São válidas as seguintes atribuições entre escalaresSão válidas as seguintes atribuições entre escalaresi=2;i=2;f=1.5f=1.5i = int(f);i = int(f);f = float(i);f = float(i);

Page 70: Computação Gráfica I

Instituto de Computação - UFF 70

OpenGL:OpenGL: operadores de atribuição operadores de atribuição

• A atribuição de valores a variáveis vetoriais admite diferentes formas:A atribuição de valores a variáveis vetoriais admite diferentes formas:

v2 = vec2(1.0,2.0); // inicializa todo o vetorv2 = vec2(1.0,2.0); // inicializa todo o vetorv2 = vec2(1.0); // ambos componentes recebem o valor 1.0v2 = vec2(1.0); // ambos componentes recebem o valor 1.0v3 = vec3(0.0,0.0,0.0); v3 = vec3(0.0,0.0,0.0); v3 = vec3(0.0);v3 = vec3(0.0);v4 = vec4(v2,v2); // combina dois vetores para formar o terceirov4 = vec4(v2,v2); // combina dois vetores para formar o terceiro

• Matrizes são construídas de forma semelhanteMatrizes são construídas de forma semelhante

m3 = mat3(2.0,1.0,0.0,1.0,2.0,0.0,0.0,0.0,1.0);m3 = mat3(2.0,1.0,0.0,1.0,2.0,0.0,0.0,0.0,1.0);m3 = mat3(2.0); // inicializa a diagonal com 2.0m3 = mat3(2.0); // inicializa a diagonal com 2.0m3[2][2] = 1.0;m3[2][2] = 1.0;m2 = mat2(m3); //canto superior esquerdo 2x2 de m3m2 = mat2(m3); //canto superior esquerdo 2x2 de m3v3 = vec3(m3);//primeira coluna da matrizv3 = vec3(m3);//primeira coluna da matrizf = float(m3); //primeiro elemento da matriz f = float(m3); //primeiro elemento da matriz

Page 71: Computação Gráfica I

Instituto de Computação - UFF 71

OpenGL:OpenGL: operadores de atribuição operadores de atribuição

• A atribuição de valores a variáveis vetoriais admite diferentes formas:A atribuição de valores a variáveis vetoriais admite diferentes formas:

v2 = vec2(1.0,2.0); // inicializa todo o vetorv2 = vec2(1.0,2.0); // inicializa todo o vetorv2 = vec2(1.0); // ambos componentes recebem o valor 1.0v2 = vec2(1.0); // ambos componentes recebem o valor 1.0v3 = vec3(0.0,0.0,0.0); v3 = vec3(0.0,0.0,0.0); v3 = vec3(0.0);v3 = vec3(0.0);v4 = vec4(v2,v2); // combina dois vetores para formar o terceirov4 = vec4(v2,v2); // combina dois vetores para formar o terceiro

• Matrizes são construídas de forma semelhanteMatrizes são construídas de forma semelhante

m3 = mat3(2.0,1.0,0.0,1.0,2.0,0.0,0.0,0.0,1.0);m3 = mat3(2.0,1.0,0.0,1.0,2.0,0.0,0.0,0.0,1.0);m3 = mat3(2.0); // inicializa a diagonal com 2.0m3 = mat3(2.0); // inicializa a diagonal com 2.0m3[2][2] = 1.0;m3[2][2] = 1.0;m2 = mat2(m3); //canto superior esquerdo 2x2 de m3m2 = mat2(m3); //canto superior esquerdo 2x2 de m3v3 = vec3(m3);//primeira coluna da matrizv3 = vec3(m3);//primeira coluna da matrizf = float(m3); //primeiro elemento da matriz f = float(m3); //primeiro elemento da matriz

Page 72: Computação Gráfica I

Instituto de Computação - UFF 72

OpenGL:OpenGL: operadores de swizzling operadores de swizzling

• Permite acessar partes de um vetor como se fosse uma estrutura, Permite acessar partes de um vetor como se fosse uma estrutura, mas com a vantagem de ser possível reordenar ou repetir os mas com a vantagem de ser possível reordenar ou repetir os componentes livremente.componentes livremente.

• Pode-se usar os elementos xyzw (coordenadas espaciais), rgba Pode-se usar os elementos xyzw (coordenadas espaciais), rgba (componentes de cor) e stpq (coordenadas de textura).(componentes de cor) e stpq (coordenadas de textura).

• As notações acima existem porque os vetores, em geral, são As notações acima existem porque os vetores, em geral, são utilizados para representar posições, direções, cores e coordenadas utilizados para representar posições, direções, cores e coordenadas de textura.de textura.

Page 73: Computação Gráfica I

Instituto de Computação - UFF 73

OpenGL:OpenGL: operadores de swizzling operadores de swizzling

• Exemplos:Exemplos:

v3.xy; // apenas x e y do vetor xyzv3.xy; // apenas x e y do vetor xyzv3.xxx; // o componente x repetido 3 vezesv3.xxx; // o componente x repetido 3 vezesv3.rrr; // mesma coisa utilizando notação rgbav3.rrr; // mesma coisa utilizando notação rgbav3.sss; // mesma coisa utilizando notação stpqv3.sss; // mesma coisa utilizando notação stpqv2 = v3.xy; // atribui a v2 os componentes xy de v3v2 = v3.xy; // atribui a v2 os componentes xy de v3v2 = v3.yz; // atribui a v2 os componentes yz de v3v2 = v3.yz; // atribui a v2 os componentes yz de v3v3 = v4.xxz // atribui (x,x,z) de v4 a v3v3 = v4.xxz // atribui (x,x,z) de v4 a v3

• Erros:Erros:

v2.z = 1.0; // v2 não contém o componente zv2.z = 1.0; // v2 não contém o componente zv3.rgz = vec3(1.0,2.0,3.0); // mistura de notaçõesv3.rgz = vec3(1.0,2.0,3.0); // mistura de notaçõesv3.xy = 12.0; // deveria atribuir um tipo vec2v3.xy = 12.0; // deveria atribuir um tipo vec2

Page 74: Computação Gráfica I

Instituto de Computação - UFF 74

OpenGL:OpenGL: operadores aritméticas entre operadores aritméticas entre dados vetoriaisdados vetoriais• Seja as declarações Seja as declarações

vec2 a,b,c;vec2 a,b,c;mat2 ma, mb, mc;mat2 ma, mb, mc;

• São válidas as operações:São válidas as operações:

a = b+c; // adição vetoriala = b+c; // adição vetoriala.x = b.x + c.x; a.x = b.x + c.x; a.y = b.y + c.y; // ineficientea.y = b.y + c.y; // ineficiente

b = a * ma; // multiplicação de vetor por matriz resultando em vetorb = a * ma; // multiplicação de vetor por matriz resultando em vetormc = ma * mb // multiplicação matricialmc = ma * mb // multiplicação matricial

Page 75: Computação Gráfica I

Instituto de Computação - UFF 75

OpenGL:OpenGL: exemplo de shader para exemplo de shader para iluminação por pixeliluminação por pixel

//Vertex shader//Vertex shader

varying vec3 N;varying vec3 N;varying vec3 v;varying vec3 v; void main(void) {void main(void) {

v = vec3(gl_ModelViewMatrix * gl_Vertex);v = vec3(gl_ModelViewMatrix * gl_Vertex); N = normalize(gl_NormalMatrix * gl_Normal);N = normalize(gl_NormalMatrix * gl_Normal); gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

}}

// Fragment Shader// Fragment Shadervarying vec3 N;varying vec3 N;varying vec3 v; varying vec3 v;

void main(void) {void main(void) {vec3 L = normalize(gl_LightSource[0].position.xyz - v);vec3 L = normalize(gl_LightSource[0].position.xyz - v);vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);Idiff = clamp(Idiff, 0.0, 1.0); Idiff = clamp(Idiff, 0.0, 1.0); gl_FragColor = Idiff;gl_FragColor = Idiff;

}}

Page 76: Computação Gráfica I

Instituto de Computação - UFF 76

OpenGL:OpenGL: funções para interface com funções para interface com GLSLGLSL• Existem 4 atividades necessárias para utilização da GLSL com o Existem 4 atividades necessárias para utilização da GLSL com o

programas do usuário:programas do usuário:

− Compilação e ligação dos shaders em um programa completo.Compilação e ligação dos shaders em um programa completo.

− Envio dos valores a serem utilizados pelos shaders (uniform e Envio dos valores a serem utilizados pelos shaders (uniform e attribute).attribute).

− Inicialização da GLSL.Inicialização da GLSL.

− Utilização do programa.Utilização do programa.

Page 77: Computação Gráfica I

Instituto de Computação - UFF 77

OpenGL:OpenGL: compilação e ligação compilação e ligação

• Em primeiro lugar é necessário criar os objetos que representarão os Em primeiro lugar é necessário criar os objetos que representarão os programas de vértice ou fragmento através da seguinte função:programas de vértice ou fragmento através da seguinte função:

− GLuint glCreateShader(GLenum shaderType)GLuint glCreateShader(GLenum shaderType)

• shaderType pode ser GL_VERTEX_SHADER (programa de vértice) shaderType pode ser GL_VERTEX_SHADER (programa de vértice) ou GL_FRAGMENT_SHADER (programa de fragmento)ou GL_FRAGMENT_SHADER (programa de fragmento)

Page 78: Computação Gráfica I

Instituto de Computação - UFF 78

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A segunda etapa é enviar o código-fonte GLSL que é armazenado em A segunda etapa é enviar o código-fonte GLSL que é armazenado em uma string ou vetor de caracteres para ser compilado:uma string ou vetor de caracteres para ser compilado:

− void glShaderSource(GLuint shader, GLsizei count, const GLchar void glShaderSource(GLuint shader, GLsizei count, const GLchar ** string, const GLint *length)** string, const GLint *length)

• shader é um identificador válido de programa de vértice ou fragmento;shader é um identificador válido de programa de vértice ou fragmento;

• count indica quantas linhas de texto deverão ser interpretadas;count indica quantas linhas de texto deverão ser interpretadas;

• string aponta para uma ou mais linhas de código do programa;string aponta para uma ou mais linhas de código do programa;

• length é um array que indica o tamanha de cada linha, podendo ser length é um array que indica o tamanha de cada linha, podendo ser igual a null, o que indica a que as strings são terminadas com o igual a null, o que indica a que as strings são terminadas com o caractere nulo do C.caractere nulo do C.

Page 79: Computação Gráfica I

Instituto de Computação - UFF 79

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A terceira etapa consiste em compilar o código utilizando:A terceira etapa consiste em compilar o código utilizando:

void glCompileShader(GLuint shader)void glCompileShader(GLuint shader)

• É bastante útil utilizar funções que indiquem erros de compilaçãoÉ bastante útil utilizar funções que indiquem erros de compilação

• Isto pode ser feito utilizando as funçõesIsto pode ser feito utilizando as funções

void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);

void glGetShaderInfoLog(GLuint shader, GLsizei maxLenght,void glGetShaderInfoLog(GLuint shader, GLsizei maxLenght, GLsizei *length, GLChar * infoLog); GLsizei *length, GLChar * infoLog);

Page 80: Computação Gráfica I

Instituto de Computação - UFF 80

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A função void glGetShaderiv(GLuint shader, GLenum pname, GLint A função void glGetShaderiv(GLuint shader, GLenum pname, GLint *params) obtêm parâmetros relativos a um shader tais como:*params) obtêm parâmetros relativos a um shader tais como:

‒ GL_SHADER_TYPE – (tipo do shader, GL_VERTEX_SHADER ou GL_SHADER_TYPE – (tipo do shader, GL_VERTEX_SHADER ou GL_FRAGMENT_SHADER)GL_FRAGMENT_SHADER)

‒ GL_DELETE_STATUS – (true se o shader tiver sido marcado para GL_DELETE_STATUS – (true se o shader tiver sido marcado para deleção)deleção)

‒ GL_COMPILE_STATUS – (true se a última compilação tiver tido GL_COMPILE_STATUS – (true se a última compilação tiver tido sucesso)sucesso)

‒ GL_INFO_LOG_LENGTH – (tamanho do log de compilação)GL_INFO_LOG_LENGTH – (tamanho do log de compilação)

‒ GL_SHADER_SOURCE_LENGTH – (tamanho do código fonte)GL_SHADER_SOURCE_LENGTH – (tamanho do código fonte)

Page 81: Computação Gráfica I

Instituto de Computação - UFF 81

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A função void glGetShaderInfoLog(GLuint shader, GLsizei A função void glGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLChar * infoLog) obtém o log de maxLength, GLsizei *length, GLChar * infoLog) obtém o log de compilação do shader indicado no parâmetro shader.compilação do shader indicado no parâmetro shader.

‒ maxLength indica o tamanho máximo do log que pode ser maxLength indica o tamanho máximo do log que pode ser armazenado na string infoLog;armazenado na string infoLog;

‒ length devolve a quantidade de caracteres efetivamente copiadoslength devolve a quantidade de caracteres efetivamente copiados

‒ infoLog aponta para a string capaz de armazenar maxLength infoLog aponta para a string capaz de armazenar maxLength caracteres caracteres

Page 82: Computação Gráfica I

Instituto de Computação - UFF 82

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A segunda etapa é enviar o código-fonte GLSL que é armazenado em A segunda etapa é enviar o código-fonte GLSL que é armazenado em uma string ou vetor de caracteres para ser compilado:uma string ou vetor de caracteres para ser compilado:

− void glShaderSource(GLuint shader, GLsizei count, const GLchar void glShaderSource(GLuint shader, GLsizei count, const GLchar ** string, const GLint *length)** string, const GLint *length)

• shader é um identificador válido de programa de vértice ou fragmento;shader é um identificador válido de programa de vértice ou fragmento;

• count indica quantas linhas de texto deverão ser interpretadas;count indica quantas linhas de texto deverão ser interpretadas;

• string aponta para uma ou mais linhas de código do programa;string aponta para uma ou mais linhas de código do programa;

• length é um array que indica o tamanha de cada linha, podendo ser length é um array que indica o tamanha de cada linha, podendo ser igual a null, o que indica a que as strings são terminadas com o igual a null, o que indica a que as strings são terminadas com o caractere nulo do C.caractere nulo do C.

Page 83: Computação Gráfica I

Instituto de Computação - UFF 83

OpenGL:OpenGL: compilação e ligação compilação e ligação

• A última etapa consiste na criação de um programa GLSL que na A última etapa consiste na criação de um programa GLSL que na verdade é formado por um conjunto de programas de vértice ou verdade é formado por um conjunto de programas de vértice ou fragmento integrados.fragmento integrados.

• Um programa GLSL deve conter pelo menos um programa de vértice Um programa GLSL deve conter pelo menos um programa de vértice ou um programa de fragmento.ou um programa de fragmento.

• Para criar um programa de vértice, associar shaders a ele e efetuar a Para criar um programa de vértice, associar shaders a ele e efetuar a ligação utiliza-se as seguintes funções:ligação utiliza-se as seguintes funções:

GLuint glCreateProgram(void);GLuint glCreateProgram(void);void glAttachshader(GLuint program, GLuint shader);void glAttachshader(GLuint program, GLuint shader);void glLinkProgram(GLuint program);void glLinkProgram(GLuint program);

Page 84: Computação Gráfica I

Instituto de Computação - UFF 84

OpenGL:OpenGL: compilação e ligação compilação e ligação

• É possível checar o status da ligação obtendo o valor do parâmetro É possível checar o status da ligação obtendo o valor do parâmetro GL_LINK_STATUS com a função glGetShaderiv conforme abaixo:GL_LINK_STATUS com a função glGetShaderiv conforme abaixo:

glGetShaderiv(program, GL_LINK_STATUS, &ligacao_OK) glGetShaderiv(program, GL_LINK_STATUS, &ligacao_OK)

• ligacao_OK é do tipo GLint e retorna com valor 0 se houver algum ligacao_OK é do tipo GLint e retorna com valor 0 se houver algum problema.problema.

Page 85: Computação Gráfica I

Instituto de Computação - UFF 85

OpenGL:OpenGL: compilação e ligação compilação e ligação

• Existem funções para cancelar a associação de shaders a Existem funções para cancelar a associação de shaders a programas GLSL, assim como remover shaders ou programas GLSL, assim como remover shaders ou programas:programas:

• void glDetachShader(GLuint program, GLuint shader);void glDetachShader(GLuint program, GLuint shader);

• void glDeleteShader(GLuint shader) - libera a area ocupada void glDeleteShader(GLuint shader) - libera a area ocupada por um shader; o shader só será removido se não estiver por um shader; o shader só será removido se não estiver associado a nenhum programaassociado a nenhum programa

• void glDeleteProgram(GLuint program) – libera a área de void glDeleteProgram(GLuint program) – libera a área de memória ocupada por um programa; se o programa tiver memória ocupada por um programa; se o programa tiver shaders associados, estes serão desconectados mas não shaders associados, estes serão desconectados mas não removidos a não ser que tenha sido solicitada sua remoção removidos a não ser que tenha sido solicitada sua remoção através da função glDeleteShader através da função glDeleteShader

Page 86: Computação Gráfica I

Instituto de Computação - UFF 86

OpenGL:OpenGL: envio de valores a GLSL envio de valores a GLSL

• Os qualificadores uniform e attribute permitem o envio de valores do Os qualificadores uniform e attribute permitem o envio de valores do programa do usuário ao programa GLSL.programa do usuário ao programa GLSL.

• Para isto, é necessário obter um identificador que relacione uma Para isto, é necessário obter um identificador que relacione uma posição de memória a uma variável especifica.posição de memória a uma variável especifica.

• Tais identificadores podem ser recuperados pelas seguintes funções:Tais identificadores podem ser recuperados pelas seguintes funções:

• GLint glGetUniformLocation(GLuint program, const GLchar GLint glGetUniformLocation(GLuint program, const GLchar *name);*name);

• GLint glGetAttributeLocation(GLuint program, const GLchar GLint glGetAttributeLocation(GLuint program, const GLchar *name)*name)

Page 87: Computação Gráfica I

Instituto de Computação - UFF 87

OpenGL:OpenGL: envio de valores a GLSL envio de valores a GLSL

• GLint glGetUniformLocation(GLuint program, const GLchar *name);GLint glGetUniformLocation(GLuint program, const GLchar *name);

– Retorna a posição de uma variável uniform com nome Retorna a posição de uma variável uniform com nome indicado pelo parâmetro name no programa GLSL indicado pelo parâmetro name no programa GLSL indicado pelo parâmetro program.indicado pelo parâmetro program.

• GLint glGetAttributeLocation(GLuint program, const GLchar *name);GLint glGetAttributeLocation(GLuint program, const GLchar *name);

– Retorna a posição de uma variável attribute com nome Retorna a posição de uma variável attribute com nome indicado pelo parâmetro name no programa GLSL indicado pelo parâmetro name no programa GLSL indicado pelo parâmetro program.indicado pelo parâmetro program.

• Ambas as funções só podem ser chamadas após a ligação do Ambas as funções só podem ser chamadas após a ligação do programa através de glLinkProgram.programa através de glLinkProgram.

• Retornam -1 se a variável não existir.Retornam -1 se a variável não existir.

Page 88: Computação Gráfica I

Instituto de Computação - UFF 88

OpenGL:OpenGL: envio de valores a GLSL envio de valores a GLSL

• Para enviar os valores em si utiliza-se no caso de uma variável Para enviar os valores em si utiliza-se no caso de uma variável uniform, alguma das variações de glUniform{1234}f[v]:uniform, alguma das variações de glUniform{1234}f[v]:

void glUniform1f(GLint location, GLfloat v0);void glUniform1f(GLint location, GLfloat v0);void glUniform1fv(GLint location, GLsizei count, GLfloat *value);void glUniform1fv(GLint location, GLsizei count, GLfloat *value);

• A primeira função atribui um único valor a uma variável uniform cuja A primeira função atribui um único valor a uma variável uniform cuja posição é indicada por location obtido anteriormente por posição é indicada por location obtido anteriormente por glGetUniformLocationglGetUniformLocation

• A segunda função atribui um vetor cujo tamanho é indicado por count.A segunda função atribui um vetor cujo tamanho é indicado por count.

Page 89: Computação Gráfica I

Instituto de Computação - UFF 89

OpenGL:OpenGL: envio de valores a GLSL envio de valores a GLSL

• Para atribuição de valores a variáveis attribute utiliza-se processo Para atribuição de valores a variáveis attribute utiliza-se processo similar:similar:

void glVertexAttrib1f (GLuint index, GLfloat v0);void glVertexAttrib1f (GLuint index, GLfloat v0);void glVertexAttrib1s (GLuint index, GLshort v0);void glVertexAttrib1s (GLuint index, GLshort v0);void glVertexAttrib1d (GLuint index, GLdouble v0);void glVertexAttrib1d (GLuint index, GLdouble v0);void glVertexAttrib1fv (GLuint index, GLsizei count, GLfloat void glVertexAttrib1fv (GLuint index, GLsizei count, GLfloat

*value);*value);

Page 90: Computação Gráfica I

Instituto de Computação - UFF 90

OpenGL:OpenGL: inicialização e uso inicialização e uso

• A inicialização é normalmente feita através de uma biblioteca auxiliar A inicialização é normalmente feita através de uma biblioteca auxiliar como a GLEW já que os headers da biblioteca OpenGL não foram como a GLEW já que os headers da biblioteca OpenGL não foram atualizados para a versão 2.0atualizados para a versão 2.0

• Uma vez que o programa GLSL tenha sido carregado, pode-se utilizá-Uma vez que o programa GLSL tenha sido carregado, pode-se utilizá-lo através do comando void glUseProgram(GLuint prog);lo através do comando void glUseProgram(GLuint prog);

• Passando-se o valor especial 0 (zero) no parâmetro prog, desativa-se Passando-se o valor especial 0 (zero) no parâmetro prog, desativa-se o pipeline programável e retorna-se ao pipeline convencional.o pipeline programável e retorna-se ao pipeline convencional.

Page 91: Computação Gráfica I

Instituto de Computação - UFF 91

OpenGL:OpenGL: exemplo exemplo

#include <windows.h>#include <windows.h>#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

#include <glew.h>#include <glew.h>#include <glut.h>#include <glut.h>

#include "image.h"#include "image.h"#include "textfile.h"#include "textfile.h"

float a=0.0,inter=1,textMapping;float a=0.0,inter=1,textMapping;GLuint loc,enableTexture;GLuint loc,enableTexture;GLuint textureHnd,v,f,f2,p;GLuint textureHnd,v,f,f2,p;tpImage * grassImage;tpImage * grassImage;

GLfloat luzAmbiente[4]={0.0,0.0,0.0,1.0};GLfloat luzAmbiente[4]={0.0,0.0,0.0,1.0};GLfloat luzDifusa[4]={0.5,0.5,0.5,1.0};GLfloat luzDifusa[4]={0.5,0.5,0.5,1.0};GLfloat luzEspecular[4]={0.8,0.8,0.8,1.0};GLfloat luzEspecular[4]={0.8,0.8,0.8,1.0};GLfloat posicaoLuz[4]={0.0,10.0,10.0,1.0};GLfloat posicaoLuz[4]={0.0,10.0,10.0,1.0};GLfloat especularidade[4]={0.5,0.5,0.5,1.0};GLfloat especularidade[4]={0.5,0.5,0.5,1.0};GLfloat materialdifuso[4]={0.5,0.5,0.5,1.0};GLfloat materialdifuso[4]={0.5,0.5,0.5,1.0};GLfloat materialespecular[4]={0.8,0.8,0.8,1.0};GLfloat materialespecular[4]={0.8,0.8,0.8,1.0};GLfloat spotDirection[4] = {0.0,-1.0,-1.0,1.0};GLfloat spotDirection[4] = {0.0,-1.0,-1.0,1.0};

#define printOpenGLError() printOglError(__FILE__, __LINE__)#define printOpenGLError() printOglError(__FILE__, __LINE__)

Page 92: Computação Gráfica I

Instituto de Computação - UFF 92

OpenGL:OpenGL: exemplo exemplo

void printShaderInfoLog(GLuint obj)void printShaderInfoLog(GLuint obj){{ int infologLength = 0;int infologLength = 0; int charsWritten = 0;int charsWritten = 0; char *infoLog;char *infoLog;

glGetShaderiv(obj, glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLeGL_INFO_LOG_LENGTH,&infologLength);ngth);

if (infologLength > 0)if (infologLength > 0) {{ infoLog = (char infoLog = (char

*)malloc(infologLength);*)malloc(infologLength); glGetShaderInfoLog(obj, glGetShaderInfoLog(obj,

infologLength, infologLength, &charsWritten, &charsWritten, infoLog);infoLog);

printf("%s\n",infoLog);printf("%s\n",infoLog); free(infoLog);free(infoLog); }}}}

void printProgramInfoLog(GLuint void printProgramInfoLog(GLuint obj)obj)

{{ int infologLength = 0;int infologLength = 0; int charsWritten = 0;int charsWritten = 0; char *infoLog;char *infoLog;

glGetProgramiv(obj, glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infoloGL_INFO_LOG_LENGTH,&infologLength);gLength);

if (infologLength > 0)if (infologLength > 0) {{ infoLog = (char infoLog = (char

*)malloc(infologLength);*)malloc(infologLength); glGetProgramInfoLog(obj, glGetProgramInfoLog(obj,

infologLength, &charsWritten, infologLength, &charsWritten, infoLog);infoLog);

printf("%s\n",infoLog);printf("%s\n",infoLog); free(infoLog);free(infoLog); }}}}

Page 93: Computação Gráfica I

Instituto de Computação - UFF 93

OpenGL:OpenGL: exemplo exemplo

void setShaders() {void setShaders() {

char *vs = NULL,*fs = NULL,*fs2 = NULL;char *vs = NULL,*fs = NULL,*fs2 = NULL; v = glCreateShader(GL_VERTEX_SHADER);v = glCreateShader(GL_VERTEX_SHADER); f = glCreateShader(GL_FRAGMENT_SHADER);f = glCreateShader(GL_FRAGMENT_SHADER); vs = textFileRead("shader1.vert");vs = textFileRead("shader1.vert"); fs = textFileRead("shader1.frag");fs = textFileRead("shader1.frag"); const char * vv = vs;const char * vv = vs; const char * ff = fs;const char * ff = fs;

glShaderSource(v, 1, &vv,NULL);glShaderSource(v, 1, &vv,NULL); glShaderSource(f, 1, &ff,NULL);glShaderSource(f, 1, &ff,NULL); free(vs);free(fs);free(vs);free(fs);

glCompileShader(v);glCompileShader(v); glCompileShader(f);glCompileShader(f); printShaderInfoLog(v);printShaderInfoLog(v); printShaderInfoLog(f);printShaderInfoLog(f);

p = glCreateProgram();p = glCreateProgram(); glAttachShader(p,v);glAttachShader(p,v); glAttachShader(p,f);glAttachShader(p,f);

glLinkProgram(p);glLinkProgram(p); printProgramInfoLog(p);printProgramInfoLog(p); glUseProgram(p);glUseProgram(p);

loc = glGetUniformLocation(p,"time");loc = glGetUniformLocation(p,"time"); enableTexture = glGetUniformLocation(p,"enableTexture");enableTexture = glGetUniformLocation(p,"enableTexture"); glUniform1fARB(glGetUniformLocation(p,"internal"),inter);glUniform1fARB(glGetUniformLocation(p,"internal"),inter); glUniform1iARB(enableTexture,0);glUniform1iARB(enableTexture,0);}}

Page 94: Computação Gráfica I

Instituto de Computação - UFF 94

OpenGL:OpenGL: exemplo exemplo

void InitShaders()void InitShaders() {{ glewInit();glewInit();

if (glewIsSupported("GL_VERSION_2_0"))if (glewIsSupported("GL_VERSION_2_0"))printf("Ready for OpenGL 2.0\n");printf("Ready for OpenGL 2.0\n");

else {else { pprintf("OpenGL 2.0 not supported\n");rintf("OpenGL 2.0 not supported\n"); exit(1);exit(1); }} setShaders();setShaders();}}

void Init()void Init() {{ glClearColor(0.0,0.0,0.0,0.0);glClearColor(0.0,0.0,0.0,0.0); glEnable(GL_COLOR_MATERIAL);glEnable(GL_COLOR_MATERIAL);

glShadeModel(GL_SMOOTH);glShadeModel(GL_SMOOTH); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);

glEnable(GL_DEPTH_TEST);glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE);glEnable(GL_CULL_FACE); glCullFace(GL_BACK);glCullFace(GL_BACK); glEnable(GL_NORMALIZE);glEnable(GL_NORMALIZE); grassImage = ReadPpmImage2RGBA("grass.ppm");grassImage = ReadPpmImage2RGBA("grass.ppm"); textureHnd = CreateTexture(grassImage,GL_LINEAR,GL_LINEAR);textureHnd = CreateTexture(grassImage,GL_LINEAR,GL_LINEAR); DestroyImage(grassImage);DestroyImage(grassImage);}}

Page 95: Computação Gráfica I

Instituto de Computação - UFF 95

OpenGL:OpenGL: exemplo exemplo

void Display(void)void Display(void){{ glClear(GL_COLOR_BUFFER_BIT | glClear(GL_COLOR_BUFFER_BIT |

GL_DEPTH_BUFFER_BIT);GL_DEPTH_BUFFER_BIT); glLoadIdentity();glLoadIdentity();

gluLookAt(50.0,50.0,50.0, gluLookAt(50.0,50.0,50.0, 0.0,0.0,0.0,0.0,0.0,0.0, 0.0f,1.0f,0.0f);0.0f,1.0f,0.0f);

//glUniform1fARB(loc, a);//glUniform1fARB(loc, a); //glColor4f(1.0,1.0,1.0,1.0);//glColor4f(1.0,1.0,1.0,1.0);

glBindTexture(GL_TEXTURE_2D,-1);glBindTexture(GL_TEXTURE_2D,-1); glFrontFace(GL_CW);glFrontFace(GL_CW); glutSolidTeapot(8.0);glutSolidTeapot(8.0); glFrontFace(GL_CCW);glFrontFace(GL_CCW);

glPushMatrix();glPushMatrix(); glTranslatef(0.0,-20.0,0.0);glTranslatef(0.0,-20.0,0.0); glRotatef(90,1.0,0.0,0.0);glRotatef(90,1.0,0.0,0.0); glutSolidTorus(4.0,16.0,40,80);glutSolidTorus(4.0,16.0,40,80); glPopMatrix();glPopMatrix(); glUniform1iARB(enableTexture,1);glUniform1iARB(enableTexture,1); glBindTexture(GL_TEXTURE_2D,textureHnd);glBindTexture(GL_TEXTURE_2D,textureHnd); glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND);glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);US_SRC_ALPHA);

glNormal3f(0.0,1.0,0.0);glNormal3f(0.0,1.0,0.0);glTexCoord2d(1.0,0.0);glTexCoord2d(1.0,0.0);glVertex3f(200.0,-50.0,200.0);glVertex3f(200.0,-50.0,200.0);glNormal3f(0.0,1.0,0.0);glNormal3f(0.0,1.0,0.0);glTexCoord2d(1.0,1.0);glTexCoord2d(1.0,1.0);

glVertex3f(200.0,-50.0,-200.0);glVertex3f(200.0,-50.0,-200.0);glNormal3f(0.0,1.0,0.0);glNormal3f(0.0,1.0,0.0);glTexCoord2d(0.0,1.0);glTexCoord2d(0.0,1.0);glVertex3f(-200.0,-50.0,-200.0);glVertex3f(-200.0,-50.0,-200.0);glNormal3f(0.0,1.0,0.0);glNormal3f(0.0,1.0,0.0);glTexCoord2d(0.0,0.0);glTexCoord2d(0.0,0.0);glVertex3f(-200.0,-50.0,200.0);glVertex3f(-200.0,-50.0,200.0);

glEnd();glEnd(); glDisable(GL_BLEND);glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D);glDisable(GL_TEXTURE_2D); glUniform1iARB(enableTexture,0);glUniform1iARB(enableTexture,0);

glEnable(GL_LIGHT0); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING);glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0,GL_AMBIENT,luzAmbiente);glLightfv(GL_LIGHT0,GL_AMBIENT,luzAmbiente); glLightfv(GL_LIGHT0,GL_DIFFUSE,luzDifusa);glLightfv(GL_LIGHT0,GL_DIFFUSE,luzDifusa); glLightfv(GL_LIGHT0,GL_SPECULAR,luzEspecular);glLightfv(GL_LIGHT0,GL_SPECULAR,luzEspecular); glLightfv(GL_LIGHT0,GL_POSITION,posicaoLuz);glLightfv(GL_LIGHT0,GL_POSITION,posicaoLuz);

glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDireglLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDirection);ction);

glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0f);glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0f); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,1.5f);glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,1.5f); glMaterialfv(GL_FRONT, GL_DIFFUSE,materialdifuso);glMaterialfv(GL_FRONT, GL_DIFFUSE,materialdifuso); glMaterialfv(GL_FRONT, glMaterialfv(GL_FRONT,

GL_SPECULAR,materialespecular);GL_SPECULAR,materialespecular); glMaterialf(GL_FRONT, GL_SHININESS,5.0f);glMaterialf(GL_FRONT, GL_SHININESS,5.0f);

a += 0.01;a += 0.01; glutSwapBuffers();glutSwapBuffers();}}

Page 96: Computação Gráfica I

Instituto de Computação - UFF 96

OpenGL:OpenGL: exemplo exemplo

void Reshape(int w, int h)void Reshape(int w, int h) {{ glViewport(0,0,(GLsizei)w,(GLsizei)h);glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION);glMatrixMode(GL_PROJECTION); glLoadIdentity();glLoadIdentity(); gluPerspective(50,1.0,1.0,500.0);gluPerspective(50,1.0,1.0,500.0); glMatrixMode(GL_MODELVIEW);glMatrixMode(GL_MODELVIEW); glLoadIdentity();glLoadIdentity();}}

int main(int argc, char ** argv)int main(int argc, char ** argv) {{ glutInit(&argc, argv);glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(512,512);glutInitWindowSize(512,512); glutInitWindowPosition(100,100);glutInitWindowPosition(100,100); glutCreateWindow("Shader 1");glutCreateWindow("Shader 1"); glutDisplayFunc(Display);glutDisplayFunc(Display); glutIdleFunc(Display);glutIdleFunc(Display); glutReshapeFunc(Reshape);glutReshapeFunc(Reshape); Init();Init(); InitShaders();InitShaders(); glutMainLoop();glutMainLoop(); return 0;return 0;}}

Page 97: Computação Gráfica I

Instituto de Computação - UFF 97

OpenGL:OpenGL: exemplo exemplo

//vertex shader//vertex shaderuniform float time;uniform float time;varying vec3 normal;varying vec3 normal;varying vec3 sup;varying vec3 sup;varying float pattern;varying float pattern;

void main()void main(){{

vec4 pos = vec4(gl_Vertex);vec4 pos = vec4(gl_Vertex);//pos.z = sin(5.0*pos.x+time)*0.25;//pos.z = sin(5.0*pos.x+time)*0.25;pattern = fract(4.0*(pos.y+pos.x+pos.z));pattern = fract(4.0*(pos.y+pos.x+pos.z));sup = gl_ModelViewMatrix * pos;sup = gl_ModelViewMatrix * pos;normal = gl_NormalMatrix*gl_Normal;normal = gl_NormalMatrix*gl_Normal;gl_TexCoord[0] = gl_MultiTexCoord0;gl_TexCoord[0] = gl_MultiTexCoord0;gl_Position = gl_ModelViewProjectionMatrix * pos;gl_Position = gl_ModelViewProjectionMatrix * pos;

}}

Page 98: Computação Gráfica I

Instituto de Computação - UFF 98

OpenGL:OpenGL: exemplo exemplo

varying vec4 color;varying vec4 color;varying vec3 normal;varying vec3 normal;varying vec3 sup;varying vec3 sup;varying float pattern;varying float pattern;uniform float interna;uniform float interna;uniform sampler2D tex;uniform sampler2D tex;uniform bool enableTexture;uniform bool enableTexture;

void main(void)void main(void) {{ vec3 luz = normalize(gl_LightSource[0].position.xyz-sup);vec3 luz = normalize(gl_LightSource[0].position.xyz-sup); vec3 obs = normalize(-sup);vec3 obs = normalize(-sup); vec3 medio = normalize(obs+luz);vec3 medio = normalize(obs+luz); normal = normalize(normal);normal = normalize(normal); float spot = max(dot(gl_LightSource[0].spotDirection,-luz),0.0);float spot = max(dot(gl_LightSource[0].spotDirection,-luz),0.0); float borda = smoothstep(gl_LightSource[0].spotCosCutoff,1.0,spot);float borda = smoothstep(gl_LightSource[0].spotCosCutoff,1.0,spot); spot=pow(spot,gl_LightSource[0].spotExponent)*borda;spot=pow(spot,gl_LightSource[0].spotExponent)*borda; float difuso = max(dot(normal,luz),0.0);float difuso = max(dot(normal,luz),0.0); float especular = pow(max(dot(normal,medio),0.0),gl_FrontMaterial.shininess);float especular = pow(max(dot(normal,medio),0.0),gl_FrontMaterial.shininess); float especular2= especular*pattern;float especular2= especular*pattern; vec4 color = gl_FrontLightModelProduct.sceneColor+gl_FrontLightProduct[0].ambient+vec4 color = gl_FrontLightModelProduct.sceneColor+gl_FrontLightProduct[0].ambient+

spot*(gl_LightSource[0].diffuse*difuso+gl_LightSource[0].specular*(especular+especular2)spot*(gl_LightSource[0].diffuse*difuso+gl_LightSource[0].specular*(especular+especular2)););

vec4 texColor = texture2D(tex,gl_TexCoord[0].st);vec4 texColor = texture2D(tex,gl_TexCoord[0].st); if (enableTexture)if (enableTexture) gl_FragColor = vec4(color.rgb*texColor.rgb,color.a*texColor.a);gl_FragColor = vec4(color.rgb*texColor.rgb,color.a*texColor.a); elseelse gl_FragColor = color;gl_FragColor = color;}}

Page 99: Computação Gráfica I

Instituto de Computação - UFF 99

OpenGL:OpenGL: exemplo exemplo