14.04.2013 Views

Como Fazer um Programa, simples, em OpenGL para Trabalhar ...

Como Fazer um Programa, simples, em OpenGL para Trabalhar ...

Como Fazer um Programa, simples, em OpenGL para Trabalhar ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Como</strong> <strong>Fazer</strong> <strong>um</strong> <strong>Programa</strong>, <strong>simples</strong>, <strong>em</strong> <strong>OpenGL</strong> <strong>para</strong> <strong>Trabalhar</strong> com<br />

Il<strong>um</strong>inação (ex<strong>em</strong>plo do site da Isabel Mansour)<br />

1) Crie <strong>um</strong> <strong>Programa</strong> Simples que desenhe qualquer sólido na Tela. Há <strong>um</strong><br />

ex<strong>em</strong>plo Há Novo na Página da Disciplina, com o nome OpenBásico-I. Este programa serve<br />

também como Partida Inicial <strong>para</strong> àqueles que ainda têm dúvidas de como começar <strong>um</strong><br />

programa <strong>em</strong> <strong>OpenGL</strong>.<br />

2) Crie <strong>um</strong>a Função chamada Il<strong>um</strong>inação e Ponha ela <strong>em</strong> qualquer lugar<br />

antes da main. As explicações são dadas a seguir:<br />

A estrutura do código <strong>para</strong> il<strong>um</strong>inação de <strong>um</strong>a cena, que pode ficar inteiramente<br />

dentro de <strong>um</strong>a única função de Il<strong>um</strong>inação, <strong>em</strong> <strong>OpenGL</strong> possui as seguintes<br />

módulos (partes):<br />

(1) Definição das Estruturas de<br />

Dados <strong>para</strong> os Tipos de Luz,<br />

Posição da Luz e Tipo de Brilho<br />

(2) Definição da Cor de Fundo e<br />

como será o sombreamento nos<br />

objetos da cena.<br />

(3)Definição das reflectâncias<br />

dos Materiais e Ativar os Tipos<br />

de Luzes que prefere.<br />

(5)Faça as habilitações<br />

necessárias, incluindo uso de<br />

il<strong>um</strong>inação, número da Luz, e se<br />

vai querer o uso do Z-Buffer.<br />

(4)Define Parâmetros <strong>para</strong> cada<br />

Luz de 0 a 7


A explicação de cada bloco é dada a seguir:<br />

(1) Ex<strong>em</strong>plo:<br />

GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0};<br />

GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0}; // "cor"<br />

GLfloat luzEspecular[4]={1.0, 1.0, 1.0, 1.0};// "brilho"<br />

GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};<br />

Aqui, foram definidos três tipos de il<strong>um</strong>inação: ambiente, difusa e<br />

especular. Cada <strong>um</strong>a é <strong>um</strong> vetor R, G, B, A; ou seja, a luz que será<br />

utilizada de cada <strong>um</strong> desses tipos é <strong>um</strong>a combinação RGB. Note que a luz<br />

ambiente foi definida como sendo R = G = B = 0.2, <strong>para</strong> simular <strong>um</strong>a luz<br />

ambiente cinzenta, b<strong>em</strong> fraquinha. O Alfa, A = 1.0, significa que não há<br />

fog.<br />

A posição onde ficará essa luz está no vetor posicaoLuz, e representa <strong>um</strong><br />

ponto no espaço tridimensional (x, y, z). Despreze o quarto valor.<br />

GLfloat especularidade[4]={1.0,1.0,1.0,1.0};<br />

GLint especMaterial = 60;<br />

(2) Ex<strong>em</strong>plo:<br />

Aqui, o primeiro vetor define o quanto especular será o<br />

material renderizado. L<strong>em</strong>bre que <strong>um</strong>a reflexão especular é<br />

aquela que inside <strong>em</strong> <strong>um</strong> ponto e se espalha <strong>em</strong> <strong>um</strong>a única<br />

direção. Ao contrário da difusa que se espalha <strong>em</strong> todas as<br />

direções. Portanto, <strong>um</strong>a reflexão especular depende da<br />

posição do observador.<br />

Uma vez que a reflexão é 3D (<strong>um</strong>a <strong>para</strong> cada direção), somente<br />

os três primeiros valores são considerados.<br />

Finalmente, a intensidade da reflexão do material é definida<br />

por especMaterial, nesse caso, 60.<br />

// Especifica que a cor de fundo da janela será preta<br />

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);<br />

Aqui, essa função define de que cor será o fundo da cena.<br />

// Habilita o modelo de colorização de Gouraud<br />

glShadeModel(GL_SMOOTH);<br />

Essa função é interessante. Ela define como você quer que a<br />

luz se espalhe sobre o material. Por ex<strong>em</strong>plo, l<strong>em</strong>bre-se que<br />

os objetos renderizados são malhas triangulares. Então, cada<br />

triângulo possui a sua cor. De acordo com o ângulo de<br />

incidência da luz, ela pode insidir somente parte (se insidir<br />

inclinada) ou toda (se insidir 90 draus). Então, se o objeto<br />

for redondo, a luz vinda de <strong>um</strong> ponto, inside com diferentes<br />

intensidades <strong>em</strong> cada ponto do objeto, <strong>um</strong>a vez que o ângulo<br />

que o atinge varia. Mas, de acordo com a teoria vista <strong>em</strong>


(3) Ex<strong>em</strong>plo<br />

sala, exist<strong>em</strong> 2 maneiras de simular essa incidência: Gouhaud<br />

e Phong. Em <strong>OpenGL</strong>, GL_SMOOTH é o modelo de Gouhaud. Mas, se<br />

quiser que nào haja nenh<strong>um</strong> desses efeitos, e que <strong>simples</strong>mente<br />

cada ponto de cada triângulo dependa somente da direção e<br />

intensidade da luz incidente, use GL_FLAT. Faça o teste com<br />

os dois e veja a diferença.<br />

// Define a refletância do material<br />

glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);<br />

// Define a concentração do brilho<br />

glMateriali(GL_FRONT,GL_SHININESS,especMaterial);<br />

No it<strong>em</strong> (1) foram definidos os valores de il<strong>um</strong>inação e reflectância que serão<br />

usados. Aqui, eles são definidos explicitamente, através da função glMaterial. O<br />

arg<strong>um</strong>ento GL_FONT diz <strong>para</strong> renderizar somente as partes frontais. GL_BACK diz<br />

<strong>para</strong> renderizar as partes internar (objeto vazado, por ex<strong>em</strong>plo). Se quiser<br />

renderizar tudo, faça GL_FONT_BACK.<br />

O segundo arg<strong>um</strong>ento, informa que a reflectância da matarial é <strong>em</strong> <strong>um</strong>a única<br />

direção, como <strong>um</strong> espelho, por ex<strong>em</strong>plo. Por isso é usado o arg<strong>um</strong>ento<br />

GL_SPECULAR e depois GL_SHININESS. Finalmente, o arg<strong>um</strong>ento especularidade é<br />

o vetor definido <strong>em</strong> (1) e especMaterial é a variável definida também <strong>em</strong> (1).<br />

(4) Ex<strong>em</strong>plo:<br />

glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);<br />

glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );<br />

glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );<br />

glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );<br />

(5) Ex<strong>em</strong>plo:<br />

Aqui, finalmente definimos quantos spots de luz ir<strong>em</strong>os usar. Em OPenGL, podese<br />

usar até 8, GL_LIGHT0 a GL_LIGHT7. A função glLightfv define os parâmetros<br />

de cada spot.<br />

O primeiro arg<strong>um</strong>ento é o próprio spot usado, o segundo é que tipo de luz será<br />

usado e o terceiro é o vetor de luz correspondente, definida <strong>em</strong> (1). Assi, as três<br />

primeiras chamadas da função glLightfv define que o spot LIGHT0 será <strong>um</strong>a<br />

mistura de luz ambiente, difusa e especular (<strong>um</strong>a salada que deixa realista).<br />

Embora a difusa e a especular sejam antagônicas, é interessante ver esse efeito<br />

misturado.<br />

A quarta chamada da função glLightfv diz apenas que o spot de Luz GL_LIGHT0<br />

ficará na posição indicada pelo vetor posicaoluz, definido <strong>em</strong> (1).<br />

glEnable(GL_COLOR_MATERIAL);<br />

glEnable(GL_LIGHTING);


glEnable(GL_LIGHT0);<br />

glEnable(GL_DEPTH_TEST);<br />

Uma vez todas as luzes tenham sido definidas, ainda t<strong>em</strong>os que habilitar. Isso é <strong>para</strong> que<br />

possamos ter vários tipos de spots de luz que pod<strong>em</strong>os controlar habilitando e desabilitando<br />

rapidamente. Assim, chamamos 4 vezes a função glEnable com o arg<strong>um</strong>ento<br />

correspondente:<br />

(a) GL_COLOR_MATERIAL: Habilita a definição da cor do material a partir<br />

da cor corrente<br />

(b) GL_LIGHTING: Habilita o uso de il<strong>um</strong>inação<br />

(c) GL_LIGHT0: Habilita o uso de il<strong>um</strong>inação<br />

A última habilitação glEnable(GL_DEPTH_TEST) permite finalmente<br />

habilitar a técnica do Z-Buffer.<br />

EXERCÍCIOS<br />

(1) Que efeito acontece se com<strong>para</strong>rmos os sombreamentos de<br />

Guhaud e Flat?<br />

(2) Modifique a posição da Luz de frontal, como está<br />

sugerindo no vetor posição luz, <strong>para</strong> lateral e descreva<br />

sucintamente o efeito que gerou.<br />

(3) Use 2 spots de luz, <strong>um</strong> voltado <strong>para</strong> a alça do Tepot e<br />

outro voltado <strong>para</strong> o bico, produzindo os efeitos a<br />

seguir <strong>para</strong> spots <strong>em</strong> posições infinitas e finitas:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!