Compartilhar via


Luzes e materiais (Direct3D 9)

As luzes são usadas para iluminar objetos em uma cena. Quando a iluminação está habilitada, o Direct3D calcula a cor de cada vértice de objeto com base em uma combinação de:

Nota

Esta seção é apenas para o pipeline de função fixa. Sombreadores programáveis executam toda a iluminação explicitamente.

 

  • A cor do material atual e os texels em um mapa de textura associado.
  • As cores difusas e especulares no vértice, se especificado.
  • A cor e a intensidade da luz produzida por fontes de luz na cena ou no nível de luz ambiente da cena.

Ao usar a iluminação e os materiais do Direct3D, você permite que o Direct3D lide com os detalhes da iluminação para você. Os usuários avançados podem executar a iluminação por conta própria, se desejado.

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 fora de uma superfície. Níveis diretos de luz e luz ambiente definem a luz refletida. Você deve usar materiais para renderizar uma cena se a iluminação estiver habilitada. 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 não iluminada resulta em uma silhueta dos objetos na cena. Isso não é detalhe suficiente para a maioria das finalidades.

Luz Direta vs. Luz Ambiente

Embora a luz direta e ambiente ilumine objetos em uma cena, eles são independentes uns dos outros, eles têm efeitos muito diferentes e exigem que você trabalhe com eles de maneiras completamente diferentes.

A luz direta é exatamente isso: direto. A luz direta sempre tem direção e cor, e é um fator para sombreamento de algoritmos, como sombreamento gouraud. Diferentes tipos de luzes emitem luz direta de diferentes maneiras, criando efeitos especiais de atenuação. Você cria um conjunto de parâmetros de luz para luz direta chamando o método IDirect3DDevice9::SetLight.

A luz ambiente está efetivamente em todos os lugares em uma cena. Você pode pensar nisso como um nível geral de luz que preenche uma cena inteira, independentemente dos objetos e seus locais 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étodo IDirect3DDevice9::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, em que cada componente é um valor inteiro de 0 a 255. Isso é diferente da maioria dos valores de cores no Direct3D.

Você pode usar a macro D3DCOLOR_RGBA para gerar valores RGBA. Os componentes vermelho, verde e azul são combinados para tornar a cor final da luz ambiente. O componente alfa controla a transparência da cor. Ao usar a aceleração de hardware ou a emulação RGB, o componente alfa é ignorado.

Modelo de Luz Direct3D vs. Natureza

Na natureza, quando a luz é emitida de uma fonte, ela é refletida de centenas, se não milhares ou milhões de objetos antes de atingir o olho do usuário. Cada vez que ele é refletido, alguma luz é absorvida por uma superfície, algumas são dispersas em direções aleatórias, e o resto vai para outra superfície ou para o olho do usuário. Esse 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 para gráficos Direct3D em tempo real. Portanto, com a velocidade em mente, o modelo de luz Direct3D aproxima-se 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 uma superfície, a cor clara 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 usados pelo Direct3D, consulte Matemática da Iluminação (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 dispersa tanto que sua direção e origem são indeterminados: mantém um baixo nível de intensidade em todos os lugares. A iluminação indireta usada pelos fotógrafos é um bom exemplo de luz ambiente. A luz ambiente no Direct3D, como na natureza, não tem direção ou origem real, apenas uma cor e intensidade. Na verdade, o nível de luz ambiente é completamente independente de qualquer objeto em uma cena que gere 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 realces especular e sua direção é usada como um fator em algoritmos de sombreamento, incluindo sombreamento 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 a forma como iluminam uma cena.

Além disso, o material de um polígono tem propriedades que afetam como esse polígono reflete a luz recebida. Você define uma única característica de reflexão que descreve como o material reflete a luz ambiente e define características individuais para determinar a reflexão especular e difusa do material. Para obter mais informações, consulte Material (Direct3D 9).

Valores de cores para luzes e materiais

O Direct3D descreve a cor em termos de quatro componentes vermelhos, verdes, azuis 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 as luzes e os materiais usem a mesma estrutura para descrever a cor, os valores na estrutura são usados de forma um pouco diferente por cada um.

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, somente 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 desativada (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 no meio. As cores que vêm através das lentes combinam para tornar a cor final da luz. Uma combinação como R(1.0), G(1.0), B(1.0) cria uma luz branca, em que R(0.0), G(0.0), B(0.0) não emite luz. Você pode criar uma luz que emite apenas um componente, resultando em uma luz vermelha, verde ou azul pura; ou, a luz pode usar combinações para emitir cores como amarelo ou roxo. Você pode até mesmo definir valores negativos de componente de cor para criar uma "luz escura" que realmente remove a luz de uma cena. Ou, você pode definir os componentes como algum valor maior que 1,0 para criar uma luz extremamente brilhante.

Com materiais, por outro lado, os valores de cor representam o quanto um componente de luz é refletido por uma superfície 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 direcionada a ele. Os materiais têm vários valores de reflexão para criar vários tipos de efeitos.

Informações adicionais estão contidas em: de tipos de luz(Direct3D 9) e propriedades leves (Direct3D 9).

introdução