Ao utilizar a função glColor estamos a dizer ao OpenGL que cor <strong>de</strong>ve ser utilizada para os vértices <strong>de</strong>senhadosa seguir. No entanto, todas as primitivas para além do ponto contém mais do que um vértice. A forma comosão <strong>de</strong>senhados os pontos intermédios dos vértices, nessas primitivas, por exemplo para uma linha, <strong>de</strong>pen<strong>de</strong> domo<strong>de</strong>lo <strong>de</strong> shading escolhido.A Figura 5.7 mostra como as cores são seleccionadas no caminho entre dois vértices <strong>de</strong> uma linha, on<strong>de</strong> oprimeiro é preto e o segundo é branco. Pela análise da figura, po<strong>de</strong>mos concluir que a linha aparecerá como umgradiente <strong>de</strong> preto para branco.O shading <strong>de</strong> polígonos é um pouco mais complexo. Um triângulo po<strong>de</strong> ser também <strong>de</strong>senhado <strong>de</strong>ntro docubo RGB Colorspace, como mostra a Figura 5.8(a).(a) Cores dos vértices nos eixos <strong>de</strong> cor(b) Triângulo RGBA imagem 5.8(b), po<strong>de</strong> ser obtida com o código:GL2 gl = drawable . getGL (). getGL2 ();...// Utilizar smooth shadinggl. glSha<strong>de</strong>Mo<strong>de</strong>l ( GL2 . GL_SMOOTH );gl. glBegin ( GL2 . GL_TRIANGLE_STRIP );// Vermelhogl. glColor3f (1f, 0f, 0f);gl. glVertex3f (40f, 0f, 0f);// Ver<strong>de</strong>gl. glColor3f (0f, 1f, 0f);gl. glVertex3f (0f, 60f, 0f);// Azulgl. glColor3f (0f, 0f, 1f);gl. glVertex3f ( -40f, 0f, 0f);gl. glEnd ();Figura 5.8: Triângulo no RGB ColorspaceO mo<strong>de</strong>lo por omissão <strong>de</strong> shading no OpenGL é o GL2.GL SMOOTH, no qual a transição entre as cores é a<strong>de</strong>scrita em cima. O outro mo<strong>de</strong>lo é o GL2.GL FLAT, no qual a cor da superfície utilizada correspon<strong>de</strong> à cor doultimo vértice, com a excepção das primitivas GL POLYGON, on<strong>de</strong> a cor utilizada é do primeiro vértice.Para alterar o shading mo<strong>de</strong>l utilizado pelo OpenGL, po<strong>de</strong>mos utilizar a função:gl. glSha<strong>de</strong>Mo<strong>de</strong>l ( int mo<strong>de</strong>l );Utilizando como argumento uma das constantes GL2.GL SMOOTH ou GL2.GL FLAT.43
5.3 Cores no Mundo RealO shading dos objectos no mundo real não se resume apenas aos valores RGB das cores. Ao preenchermossuperfícies com cores, os nossos mo<strong>de</strong>los estão longe <strong>de</strong> parecer reais (Figura 5.9).Figura 5.9: Objecto preenchido com cores diferentes em cada polígonoO OpenGL simula <strong>de</strong> forma bastante aproximada as condições <strong>de</strong> luz num ambiente real. Com a excepção dosobjectos que emitem luz própria, todos eles são afectados por três tipos <strong>de</strong> luz: ambiente, difusa e especular.5.3.1 Luz AmbienteA luz ambiente não tem direccionalida<strong>de</strong>. As superfícies dos objectos <strong>de</strong> uma cena são afectadas <strong>de</strong> forma igual euniforme (Figura 5.10). O resultado <strong>de</strong> uma cena com uma luz ambiente é semelhante aos exemplos ilustradosaté agora on<strong>de</strong> a cor é uniforme.Figura 5.10: Objecto iluminado com luz ambiente5.3.2 Luz DifusaA luz difusa provém <strong>de</strong> uma direcção específica mas é reflectida <strong>de</strong> maneira uniforme pelas superfícies em váriosângulos (Figura 5.11). No entanto, as superfícies iluminadas directamente, são mais claras que as ilmunidadascom um <strong>de</strong>terminado ângulo. Um bom exemplo <strong>de</strong> luz difusa é uma lâmpada fluorescente.Figura 5.11: Objecto iluminado com Luz Difusa44