Propriedades light (Direct3D 9)
As propriedades de luz descrevem o tipo e a cor de uma fonte de luz. Dependendo do tipo de luz que está sendo usada, uma luz pode ter propriedades para 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 leves para todos os tipos de fontes de luz. Esta seção contém informações para todas as propriedades de luz. As informações são divididas nos grupos a seguir.
As propriedades de posição, intervalo e atenuação definem a localização de uma luz no espaço mundial e como a luz que ela emite 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.
- de Atenuação Leve
- de cor clara
- de Direção da Luz
- de Posição Leve
- de intervalo de luz
Atenuação leve
A atenuação controla como a intensidade de uma luz diminui em direção à distância máxima especificada pela propriedade de 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 aplicativos definem o membro atenuado1 como 1.0 e os outros como 0.0, resultando em intensidade de luz que muda como 1/D, em que D é a distância da fonte de luz para o vértice. A intensidade máxima de luz está na origem, diminuindo para 1/(Intervalo de Luz) no 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 estranhos. Valores de atenuação negativos, no entanto, não são permitidos. Consulte Fator de Atenuação e Destaque (Direct3D 9).
Cor clara
As luzes no Direct3D emitem três cores que são usadas independentemente nos cálculos de iluminação do sistema: uma cor difusa, uma cor ambiente e uma cor especular. Cada um é incorporado pelo módulo de iluminação Direct3D, interagindo com um equivalente do material atual, para 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 de D3DLIGHT9 inclui três membros para essas cores - Difusa, Ambiente e Especular - cada uma é uma estrutura D3DCOLORVALUE que define a cor que está sendo emitida.
O tipo de cor que se aplica mais fortemente aos cálculos do sistema é a cor difusa. A cor difusa mais comum é branca (R:1.0 G:1.0 B:1.0), mas você pode criar cores conforme necessário para obter efeitos desejados. Por exemplo, você pode usar o sinal vermelho para uma lareira ou usar luz verde para um sinal de tráfego definido como "Ir".
Em geral, você define os componentes de cor clara para 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 branca". 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.
Normalmente, as cores do material são usadas para iluminação. No entanto, você pode especificar que as cores de material emissive, ambiente, difusa e especular devem ser substituídas por 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 | Inadimplência |
---|---|---|---|
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 | VERDADEIRO |
O valor alfa/transparência sempre vem apenas do canal alfa da cor difusa.
O valor da neblina sempre vem apenas do canal alfa da cor especular.
D3DMATERIALCOLORSOURCE pode ter os seguintes valores.
- 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 de uma luz determina a direção que a luz emitida pelo objeto viaja, no espaço mundial. 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 - ao longo do eixo z positivo - tem um vetor de direção de <0,0,1> não importa onde sua posição esteja definida. Da mesma forma, você pode simular a luz solar 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 corresponder valores para criar luzes que brilham em ângulos mais interessantes.
Nota
Embora você não precise normalizar o vetor de direção de uma luz, sempre certifique-se de que ela tenha magnitude. Em outras palavras, não use um vetor de direção de <0,0,0>.
Posição de luz
A posição de luz é descrita usando uma estrutura D3DVECTOR no membro Position da estrutura D3DLIGHT9. As coordenadas x, y e z são consideradas no espaço mundial. As luzes direcionais são o único tipo de luz que não usa a propriedade de posição.
Intervalo de luz
Uma propriedade de intervalo de luz determina a distância, no espaço mundial, na qual as malhas em uma cena não recebem mais luz emitida por esse objeto. O membro Range contém um valor de ponto flutuante que representa o intervalo máximo da luz, no espaço mundial. As luzes direcionais não usam a propriedade range.
Tópicos relacionados