Share via


Propriedades light (Direct3D 9)

As propriedades de luz descrevem o tipo e a cor de uma fonte de luz. Dependendo do tipo de luz usado, uma luz pode ter propriedades de atenuação e intervalo ou para efeitos de destaque. Mas nem todos os tipos de luzes usam todas as propriedades. O Direct3D usa a estrutura D3DLIGHT9 para transportar informações sobre propriedades de luz para todos os tipos de fontes de luz. Esta seção contém informações para todas as propriedades leves. As informações são divididas nos grupos a seguir.

As propriedades de posição, intervalo e atenuação definem o local da luz no espaço do mundo e como a iluminação emitida se comporta à distância. Assim como acontece com todas as propriedades leves que você usa em C++, elas estão contidas na estrutura D3DLIGHT9 de uma luz.

Atenuação leve

A atenuação controla como a intensidade da luz diminui em direção à distância máxima especificada pela propriedade do intervalo. Três membros da estrutura D3DLIGHT9 representam atenuação leve: Atenuação0, Atenuação1 e Atenuação2. Esses membros contêm valores de ponto flutuante que variam de 0,0 a infinito, controlando a atenuação de uma luz. Alguns apps definem o membro do Atenuação1 como 1,0 e a outros como 0,0, o que resulta em intensidade de luz que muda como 1 / D, onde D é a distância da fonte de luz para o vértice. A intensidade da luz máxima está na origem, diminuindo a distância da luz para 1 / (intervalo da luz). Normalmente, um aplicativo define Atenuação0 como 0,0, Atenuação1 como um valor constante e Atenuação2 como 0,0.

Você pode combinar valores de atenuação para obter efeitos de atenuação mais complexos. Ou você pode defini-los como valores fora do intervalo normal para criar efeitos de atenuação ainda mais incomuns. Entretanto, não é permitido usar valores de atenuação negativos. Consulte Atenuação e fator de destaque (Direct3D 9).

Cor da luz

As luzes no Direct3D emitem três cores que são usadas de forma independente em cálculos de iluminação do sistema: uma cor difusa, uma ambiente e uma especular. Cada uma é incorporada pelo módulo de iluminação do Direct3D e interage com uma parte do material atual a fim de produzir uma cor final usada na renderização. A cor difusa interage com a propriedade de reflexão difusa do material atual, a cor especular com a propriedade de reflexão especular do material e assim por diante. Para obter detalhes sobre como o Direct3D aplica essas cores, consulte Matemática da iluminação (Direct3D 9).

Em um aplicativo C++, a estrutura D3DLIGHT9 inclui três membros para essas cores – Difusa, Ambiente e Especular – cada uma delas é uma estrutura D3DCOLORVALUE que define a cor que está sendo emitida.

O tipo de cor que se aplica mais intensamente aos cálculos do sistema é o difuso. A cor difusa mais comum é o branco (R:1,0 G:1,0 B:1,0), mas você pode criar cores conforme necessário para obter os efeitos desejados. Por exemplo, você pode usar a luz vermelha para uma lareira ou verde para um sinal de tráfego definido como "Avançar".

Em geral, você define os componentes de cor da luz como valores entre 0,0 e 1,0, inclusive, mas isso não é um requisito. Por exemplo, você pode definir todos os componentes como 2.0, criando uma luz "mais brilhante que o branco". Esse tipo de configuração pode ser especialmente útil quando você usa configurações de atenuação que não sejam constantes.

Observe que, embora o Direct3D use valores RGBA para luzes, o componente de cor alfa não é usado.

Em geral, as cores materiais são usadas para iluminação. No entanto, você pode especificar que as cores materiais de emissão, ambiente, difusas e especulares devem ser substituídas pelas cores de vértice difusas ou especulares. Isso é feito chamando SetRenderState e definindo as variáveis de estado do dispositivo listadas na tabela a seguir.

Variável de estado do dispositivo Significado Tipo Padrão
D3DRS_AMBIENTMATERIALSOURCE Define onde obter a cor do material ambiente. D3DMATERIALCOLORSOURCE D3DMCS_MATERIAL
D3DRS_DIFFUSEMATERIALSOURCE Define onde obter a cor do material difuso. D3DMATERIALCOLORSOURCE D3DMCS_COLOR1
D3DRS_SPECULARMATERIALSOURCE Define onde obter a cor do material especular. D3DMATERIALCOLORSOURCE D3DMCS_COLOR2
D3DRS_EMISSIVEMATERIALSOURCE Define onde obter a cor do material emissivo. D3DMATERIALCOLORSOURCE D3DMCS_MATERIAL
D3DRS_COLORVERTEX Desabilita ou habilita o uso de cores de vértice. BOOL TRUE

 

O valor de alfa/transparência sempre vem somente do canal alfa da cor difusa.

O valor de nevoeiro sempre vem somente do canal alfa da cor especular.

D3DMATERIALCOLORSOURCE pode ter os valores a seguir.

  • D3DMCS_MATERIAL - A cor do material é usada como origem.
  • D3DMCS_COLOR1 - A cor do vértice difuso é usada como origem.
  • D3DMCS_COLOR2 - A cor do vértice especular é usada como origem.

Direção da Luz

A propriedade de direção da luz determina a direção em que a luz emitida pelo objeto se desloca no espaço do mundo. A direção é usada apenas por luzes direcionais e destaques, e é descrita com um vetor.

Defina a direção da luz no membro Direction da estrutura D3DLIGHT9 da luz. O membro de direção é do tipo D3DVECTOR. Os vetores de direção são descritos como distâncias de uma origem lógica, independentemente da posição da luz em uma cena. Portanto, um destaque que aponta diretamente para uma cena no eixo z positivo tem um vetor de direção de <0,0,1> independentemente da posição definida. Da mesma forma, você pode simular a luz do sol brilhando diretamente em uma cena usando uma luz direcional cuja direção é <0,-1,0>. Obviamente, você não precisa criar luzes que brilham ao longo dos eixos de coordenadas; você pode misturar e combinar valores para criar luzes que brilham em ângulos mais interessantes.

Observação

Embora não seja necessário normalizar um vetor de direção da luz, verifique sempre se tem magnitude. Ou seja, não use um vetor de direção <0,0,0>.

 

Posição da luz

A posição clara é descrita usando uma estrutura D3DVECTOR no membro Position da estrutura D3DLIGHT9 . As coordenadas x, y e z são consideradas no espaço do mundo. As luzes direcionais são o único tipo de luz que não usa a propriedade de posição.

Intervalo de luz

A propriedade de intervalo da luz determina a distância, no espaço do mundo, em que malhas de uma cena não recebem mais luz emitida pelo objeto. O membro Range contém um valor de ponto flutuante que representa o intervalo máximo da luz, no espaço do mundo. As luzes direcionais não usam a propriedade do intervalo.

Luzes e materiais