Luzes e materiais (Direct3D 9)
As luzes são usadas para iluminar objetos em uma cena. Quando a iluminação está ativada, o Direct3D calcula a cor de cada vértice de objeto com base numa combinação de:
Observação
Esta seção é apenas para o pipeline de função fixa. Os sombreadores programáveis executam toda a iluminação explicitamente.
- A cor atual do material e os texels em um mapa de textura associado.
- As cores difusas e especulares no vértice, se especificado.
- A cor e intensidade da luz produzida por fontes de luz na cena ou o nível de luz ambiente da cena.
Ao usar iluminação e materiais Direct3D, você permite que o Direct3D manipule os detalhes da iluminação para você. Os usuários avançados podem executar a iluminação por conta própria, se desejarem.
A forma como você trabalha com iluminação e materiais faz uma grande diferença na aparência da cena renderizada. Os materiais definem como a luz reflete em uma superfície. A luz direta e os níveis de luz ambiente definem a luz refletida. Você deve usar materiais para renderizar uma cena se a iluminação estiver ativada. As luzes não são necessárias para renderizar uma cena, mas os detalhes em uma cena renderizada sem luz não são visíveis. Na melhor das hipóteses, renderizar uma cena apagada resulta em uma silhueta dos objetos na cena. Isto não é detalhe suficiente para a maioria dos propósitos.
Luz direta vs. luz ambiente
Embora a luz direta e a luz ambiente iluminem objetos em uma cena, eles são independentes uns dos outros, têm efeitos muito diferentes e exigem que você trabalhe com eles de maneiras completamente diferentes.
A luz direta é isso mesmo: direta. A luz direta sempre tem direção e cor, e é um fator para algoritmos de sombreamento, como o sombreamento de Gouraud. Diferentes tipos de luzes emitem luz direta de maneiras diferentes, criando efeitos especiais de atenuação. Você cria um conjunto de parâmetros de luz para luz direta chamando o IDirect3DDevice9::SetLight método.
A luz ambiente está efetivamente em toda parte em uma cena. Você pode pensar nisso como um nível geral de luz que preenche uma cena inteira, independentemente dos objetos e suas localizações nessa cena. A luz ambiente não tem posição ou direção, apenas cor e intensidade. Cada luz aumenta a luz ambiente geral em uma cena. Defina o nível de luz ambiente com uma chamada para o métodoIDirect3DDevice9::SetRenderState, especificando D3DRS_AMBIENT como o parâmetro State e a cor RGBA desejada como o parâmetro Value.
A cor da luz ambiente assume a forma de um valor RGBA, onde cada componente é um valor inteiro de 0 a 255. Isso é diferente da maioria dos valores de cor no Direct3D.
Você pode usar a macro D3DCOLOR_RGBA para gerar valores RGBA. Os componentes vermelho, verde e azul combinam-se para fazer a cor final da luz ambiente. O componente alfa controla a transparência da cor. Ao usar aceleração de hardware ou emulação RGB, o componente alfa é ignorado.
Modelo de luz Direct3D vs. natureza
Na natureza, quando a luz é emitida por uma fonte, ela é refletida de centenas, se não milhares ou milhões de objetos antes de chegar ao olho do usuário. Cada vez que é refletida, alguma luz é absorvida por uma superfície, outra é espalhada em direções aleatórias, e o resto vai para outra superfície ou para o olho do usuário. Este processo continua até que a luz seja reduzida a nada ou um usuário perceba a luz.
Obviamente, os cálculos necessários para simular perfeitamente o comportamento natural da luz são muito demorados para serem usados em gráficos Direct3D em tempo real. Portanto, com a velocidade em mente, o modelo de luz Direct3D se aproxima da maneira como a luz funciona no mundo natural. O Direct3D descreve a luz em termos de componentes vermelhos, verdes e azuis que se combinam para criar uma cor final.
No Direct3D, quando a luz reflete em uma superfície, a cor da luz interage matematicamente com a própria superfície para criar a cor eventualmente exibida na tela. Para obter informações específicas sobre os algoritmos que o Direct3D usa, consulte Mathematics of Lighting (Direct3D 9).
O modelo de luz Direct3D generaliza a luz em dois tipos: luz ambiente e luz direta. Cada um tem atributos diferentes, e cada um interage com o material de uma superfície de maneiras diferentes. A luz ambiente é uma luz que foi tão dispersa que sua direção e fonte são indeterminadas: ela mantém um baixo nível de intensidade em todos os lugares. A iluminação indireta utilizada pelos fotógrafos é um bom exemplo de luz ambiente. A luz ambiente no Direct3D, como na natureza, não tem direção ou fonte real, apenas uma cor e intensidade. Na verdade, o nível de luz ambiente é completamente independente de quaisquer objetos em uma cena que geram luz. A luz ambiente não contribui para a reflexão especular.
A luz direta é a luz gerada por uma fonte dentro de uma cena; Ele sempre tem cor e intensidade, e viaja em uma direção especificada. A luz direta interage com o material de uma superfície para criar destaques especulares, e sua direção é usada como um fator em algoritmos de sombreamento, incluindo sombreamento de Gouraud. Quando a luz direta é refletida, ela não contribui para o nível de luz ambiente em uma cena. As fontes em uma cena que geram luz direta têm características diferentes que afetam como elas iluminam uma cena.
Além disso, o material de um polígono tem propriedades que afetam como esse polígono reflete a luz que recebe. Você define um único traço de refletância que descreve como o material reflete a luz ambiente e define traços individuais para determinar a refletância especular e difusa do material. Para obter mais informações, consulte Materials (Direct3D 9).
Valores de cor para luzes e materiais
O Direct3D descreve a cor em termos de quatro componentes - vermelho, verde, azul e alfa - que se combinam para criar uma cor final. A estrutura D3DCOLORVALUE C++ é definida para conter valores para cada componente. Cada membro é um valor de ponto flutuante que normalmente varia de 0,0 a 1,0, inclusive. Embora ambas as luzes e materiais usem a mesma estrutura para descrever a cor, os valores na estrutura são usados de forma um pouco diferente por cada um.
Os valores de cor para fontes de luz representam a quantidade de um componente de luz específico que ele emite. Como as luzes não usam um componente alfa, apenas os componentes vermelho, verde e azul da cor são relevantes. Você pode visualizar os três componentes como as lentes vermelha, verde e azul em uma televisão de projeção. Cada lente pode estar desligada (um valor de 0,0 no membro apropriado), pode ser o mais brilhante possível (um valor de 1,0) ou pode ser algum nível intermediário. As cores que vêm através das lentes combinam-se para fazer a cor final da luz. Uma combinação como R(1.0), G(1.0), B(1.0) cria uma luz branca, onde R(0.0), G(0.0), B(0.0) não emite luz. Você pode fazer uma luz que emite apenas um componente, resultando em uma luz vermelha, verde ou azul pura; Ou, a luz poderia usar combinações para emitir cores como amarelo ou roxo. Você pode até mesmo definir valores de componentes de cor negativos para criar uma "luz escura" que realmente remove a luz de uma cena. Ou, você pode definir os componentes para algum valor maior que 1,0 para criar uma luz extremamente brilhante.
Com materiais, por outro lado, os valores de cor representam o quanto de um componente de luz é refletido por uma superfície que é renderizada com esse material. Um material cujos componentes de cor são R(1.0), G(1.0), B(1.0), A(1.0) reflete toda a luz que vem em seu caminho. Da mesma forma, um material com R(0,0), G(1,0), B(0,0), A(1,0) reflete toda a luz verde que lhe é dirigida. Os materiais têm vários valores de refletância para criar vários tipos de efeitos.
Informações adicionais estão contidas em: Light Types (Direct3D 9)e Light Properties (Direct3D 9).
Tópicos relacionados