Ponto V!

Home OpenGL Cores, luzes e materiais
Vinícius Godoy de Mendonça
Cores, luzes e materiaisImprimir
Escrito por Vinícius Godoy de Mendonça

No artigo anterior, vimos em detalhes o que são cores, e vimos rapidamente como o hardware gráfico evoluiu para representá-las. Chegou a hora de usar esse conhecimento na OpenGL.

Definindo a cor da pintura

O comando usado para definir a cor de pintura é o comando void glColor[a][t](red, green, blue, alfa);. A letra [a] representa o número de argumentos, que pode ser 3, caso você queira especificar apenas os valores de verde, vermelho e azul, ou 4, caso você queira colocar também a transparência (alfa). Veremos a transparência com mais detalhes no futuro.

O parâmetro [t] representa o tipo de dados da função. Ele pode ser b (byte), d (double), f (float), i (integer), s (short), ub (unsigned byte), ui (unsigned int) ou us (unsigned short). Outras versões da função também aceitam a letra v ao final, indicando que os dados serão enviados dentro de um vetor.

Uma prática comum é fornecer os dados como floats. Nesse formato, especificamos 0.0f para a ausência total de cor e 1.0f para a máxima intensidade daquele componente de cor. Muitos programadores que iniciam o estudo de computação gráfica podem preferir a função glColorub, já que nela você pode especificar valores de 0 até 255, como faria na programação Windows tradicional, ou numa página HTML. Na verdade, essa é uma forma fácil de fazer com que as cores da OpenGL sejam similares aos da sua aplicação, no caso de você estar construindo um CAD, por exemplo.

Não é o caso dos jogos. Até porque, essa abordagem também tem desvantagens. A primeira é que não é adotada pela comunidade. Várias documentações e fóruns na internet se referirão a outra forma, então é bom se acostumar com ela. Em segundo lugar, a forma com floats é usada internamente pela OpenGL. Usar a forma com bytes gerará conversões o tempo todo, o que pode representar uma pequena perda de performance. Finalmente, esse formato é mais consistente caso o número de bits de cor mude, especialmente se a mudança for para mais bits.

O comando, como tudo na OpenGl, define a cor na máquina de estados. Assim, todos os que forem desenhados após ele, até a execução de um novo glColor, terão a mesma cor.

Shading

Como já vimos na prática, ao especificar num polígono ou linha vértices de cores diferentes, a OpenGL preenche o interior desse polígono com uma mudança gradual de cor. A forma como essa mudança ocorre é chamada de Shading Model.

O shading model pode ser alterado através do comando glShadeModel, bastando para isso passar o parâmetro FL_FLAT. A palavra flat significa “liso, chapado”. Com ele, a cor do interior do polígono será preenchida somente com a cor do último vértice especificado, não havendo qualquer tipo de cálculo de cor no interior do polígono.

O mundo real e a OpenGL

Como vimos, no mundo real a cor é formada por reflexão da luz sobre os materiais. Os materiais têm propriedades reflexivas e absorventes diferentes, para em cada espectro da luz. Da mesma forma, a luz também pode ter cores diferentes de acordo com o seu espectro.

Modelar a luz real é uma tarefa extremamente cara em termos computacionais. Isso porque um objeto não recebe apenas luz direta, mas também parte da luz refletida nos objetos a sua volta. Alguns algoritmos como o de radiosidade ou ray-tracing tentam fazer essa aproximação mais precisa, mas seriam impeditivamente caros numa aplicação onde a renderização é feita em tempo real, como os jogos.

A OpenGL, assim como a maioria das APIs gráficas, adotaram então um modelo de iluminação muitíssimo mais simples. Nesse modelo, a luz é calculada sobre os polígonos individuais, portanto, ela não é barrada e nem os objetos deixam sombra.

Também dizemos que cada luz é formada por três componentes: ambiente, difusa e especular. No mundo real, esses componentes obviamente não existem, mas eles serão bastante úteis em nosso modelo simplificado, já que permitem regular com boa precisão o efeito que a luz tem em nossos objetos.

Luz ambiente

A luz ambiente não vem de nenhuma direção específica. Seria o caso da luz que teve uma origem, mas já rebateu tanto até chegar no local que a direção se perdeu. A face de todos os polígonos iluminados dessa forma fica exatamente igual. Por exemplo, seria muito difícil distinguir uma esfera de um círculo se só houvesse esse tipo de luz na sala, já que não conseguiríamos distinguir o seu volume. Você pode pensar nesse tipo de luz como um fator de brilho geral.

Note que a luz ambiente, para ser calculada, não depende nem da posição do objeto e nem da posição do observador. Por isso, é o tipo mais barato de luz em termos computacionais.

Luz difusa

O componente difuso representa a luz que parece ter vindo de uma origem, mas que reflete com intensidade proporcional ao ângulo que o raio de luz atinge a superfície do objeto. Assim, a superfície do objeto parecerá mais brilhosa se a luz estiver posicionada diretamente na superfície do que a luz que pega de raspão, num ângulo maior. Exemplos origem desse tipo de luz incluem uma vela, a luz direta do sol, etc. Com esse tipo de luz, existe shading (variação de cor) entre uma área mais iluminada e outra menos iluminada, o que nos permite distinguir mais facilmente objetos tridimensionais. Na figura abaixo, temos um exemplo de objeto iluminado por luz difusa:

Luz difusa

O cálculo da luz difusa já depende da posição da origem da luz e do objeto no mundo sendo, portanto, um pouco mais caro.

Luz especular

Como a luz difusa, a luz especular tem um componente fortemente direcional, portanto, reflete-se praticamente numa única direção. Um componente especular forte faz com que haja um brilho num único ponto da figura, tal como ocorre com os metais. Já um componente fraco, torna a figura fosca, como no caso da borracha escolar, usada para apagar texto.

O cálculo desse componente de luz leva em consideração não só a origem do ponto de luz e a posição do objeto iluminado, como também a posição do espectador. Afinal, a luz especular é fortemente direcional e será mais visível se o olho estiver diretamente voltado a sua origem. A figura abaixo mostra melhor esse conceito. Nela o espectador A vê o brilho especular, enquanto B não.

A vê o brilho da luz, B não.

Por depender de tantos fatores, o componente especular é o mais caro de ser calculado.

Como a luz é representada

Ao descrevermos a nossa fonte de luz, temos que informar todos os três componentes recém apresentados. E é muito pouco provável que uma fonte de luz conterá apenas um deles. Um exemplo extremo seria um laser, como esses usados por palestrantes.

Evidentemente, ela tem um forte componente especular vermelho, o que produz um brilho muito intenso, mas apenas no ponto onde ela atinge o objeto. Se usarmos o laser no escuro, perceberemos também que ele chega a iluminar fracamente os objetos em volta dele, o que indica também um fraco componente direcional. Caso a sala tenha algum tipo de vapor ou fumaça, também poderíamos associar a esse laser um componente de luz ambiente, já que essas particulas espalhariam parte da luz, tornando quase todos os objetos na sala fracamente avermelhados.

Em cada componente da luz (especular, difuso e ambiente) fornecemos cada componente de cor desejado, usando também os três valores RGB. No caso da luz, não faz sentido falarmos em fator de transparência (alfa). Para o laser descrito anteriormente, na sala com um leve vapor, teríamos:

Especular: 0.99 vermelho, 0 verde, 0 azul
Difuso: 0.10 vermelho, 0 verde, 0 azul
Ambiente: 0.05 vermelho, 0 verde, 0 azul.

Note que o laser, por ser uma fonte de luz muito pura, é completamente desprovido de azul ou verde. Cada componente da luz também é representado por um número, que varia de 0 até 1.

Materiais

Dizer que um determinado vértice tem uma cor é interessante, mas está muito longe de como as cores funcionam no mundo real. Quando estamos preocupados com a iluminação não descrevemos os polígonos através de cores, mas dizemos que um polígono é feito de um material que reflete a maior parte da cor desejada.

Fazemos isso especificando como o material reflete os componentes ambiente, difuso e especular das luzes que recebem. Um material poderia ser brilhante, refletindo a maior parte a luz especular, enquanto absorve boa parte da luz ambiente e difusa, enquanto outro poderia ser opaco, sem refletir a luz especular em nenhuma circunstância. Além desses três componentes, um material também pode representar um componente emissivo, que indica que ele não só reflete luz, como também brilha.

No caso, o componente emissivo fará com que o objeto pareça brilhar, mas não iluminará os objetos envolta dele. Para que isso seja possível, é necessário definir uma origem de luz no centro do objeto. Veremos como definir origem de luz no próximo artigo.

Iluminando os materiais

Definir as luzes e os materiais para atingir um efeito específico requer prática. Não existe uma regra simples que te diga exatamente como o objeto vai ficar. Aqui é o ponto onde nos afastamos da ciência exata e damos lugar ao lado artístico. É por isso que programadores, que tem um talento artístico próximo ao nulo, geralmente constroem ou aceitam arquivos de ferramentas que permitam que um designer aplique esses conceitos (tal como o 3D Studio Max e o Blender).

De maneira geral, o que a OpenGL faz é multiplicar cada componente da luz em R, G e B pelo seu respectivo componente do material (essa regra só pode ser aplicada diretamente para a luz ambiente). Por isso, os números de luzes e materiais variam entre 0 e 1. Veremos mais detalhes sobre os cálculos com luzes no futuro.

Em resumo

Nesse artigo, relembramos a forma direta de definir cores. Mas vimos que ela não é muito precisa para objetos sólidos. Então, vimos o como a OpenGL modela a luz de maneira simplificada. Vimos os três componentes básicos da luz nesse modelo: ambiente, difuso e especular.

Também foi explicado que os materiais refletem cada um desses componentes, além de ter um componente a mais, o emissivo, usado para dar a sensação de que o objeto está brilhando.

Nos próximos artigo, veremos de maneira mais prática como aplicar esses conceitos dentro de nosso programa. Depois, veremos um pouco mais a fundo a matemática envolvida, o que nos ajudará a entender como exatamente a iluminação funciona.


Comentários (3)
  • Paulo Jaffet  - Parabens!
    avatar

    Parabens pelo artigo. Estou tendo a materia Computação Grafica e voce me ajudou muito em uma lista que eu estou resolvendo aqui.

  • bianca de oliveira  - cor material
    avatar

    adorei saber sobre a cor material pois eu estudo sobre cores.

    estudo cor fisica cor material especto solar cores aditivas cor luz valor ou tom cores pubtrativas

  • katiely  - cores
    avatar

    CORES PRIMATAS SÃO DO MEU SIGNO CÃNCER
    ]

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter