Compartilhar via


Iluminação difusa (Direct3D 9)

Depois de ajustar a intensidade de luz para efeitos de atenuação, o mecanismo de iluminação calcula quanto da luz restante reflete de um vértice, dado o ângulo da normal do vértice e a direção da luz incidente. O mecanismo de iluminação ignora essa etapa para luzes direcionais, porque elas não são atenuadas com a distância. O sistema considera dois tipos de reflexão, difusa e especular, e usa uma fórmula diferente para determinar a quantidade de luz que é refletida para cada um. Depois que calcular os valores de luz refletida, o Direct3D aplica esses novos valores às propriedades de reflexão difusa e especular do material atual. Os valores de cor resultantes são os componentes difusos e especulares que o rasterizador usa para produzir o sombreamento Gouraud e o realce especular.

A iluminação difusa é descrita pela seguinte equação.

Iluminação difusa = sum[Cd*Ld*(N. Ldir)*Atten*Spot]

Parâmetro Valor padrão Type Descrição
Sum N/D N/D Referência de cada componente difuso da luz.
Cd (0,0,0,0) D3DCOLORVALUE Cor difusa.
Ld (0,0,0,0) D3DCOLORVALUE Cor difusa clara.
N N/D D3DVECTOR Normal de vértice
Ldir N/D D3DVECTOR Vetor de direção do vértice de objeto à luz.
Atten N/D FLOAT Atenuação de luz. Consulte Atenuação e fator de destaque (Direct3D 9).
À Vista N/D FLOAT Fator de destaque. Consulte Atenuação e fator de destaque (Direct3D 9).

 

O valor de Cd é:

  • cor do vértice1, se DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1 e a primeira cor de vértice for fornecida na declaração de vértice.
  • cor do vértice2, se DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2 e a segunda cor de vértice for fornecida na declaração de vértice.
  • cor difusa do material

Observação

Se uma das opções DIFFUSEMATERIALSOURCE for usada e a cor do vértice não for fornecida, a cor difusa do material será usada.

 

Para calcular a atenuação (Atten) ou as características de destaque (Spot), consulte Atenuação e fator de destaque (Direct3D 9).

Componentes difusos são vinculados para estar entre 0 e 255, depois que todas as luzes são processadas e interpoladas separadamente. O valor de iluminação difusa resultante é uma combinação dos valores de luz ambiente, difusa e emissiva.

Exemplo

Neste exemplo, o objeto é colorido usando a cor difusa clara e uma cor difusa de material. O código é mostrado abaixo.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

De acordo com a equação, a cor resultante para os vértices do objeto é uma combinação da cor do material e da cor da luz.

As duas ilustrações a seguir mostram a cor de material, que é cinza, e a cor de luz, que é vermelho brilhante.

ilustração de uma ilustração de esfera cinza de uma esfera vermelha

A cena resultante é mostrada na ilustração a seguir. O único objeto na cena é uma esfera. O cálculo de iluminação difusa considera a cor difusa da luz e do material e a modifica pelo ângulo entre a direção da luz e a normal do vértice usando o produto de ponto. Como resultado, o verso da esfera obtém fica escuro à medida que a superfície das curvas da esfera se afasta da luz.

ilustração de uma esfera com iluminação difusa

Combinar a iluminação difusa com a iluminação ambiente dos exemplos anteriores sobreará toda a superfície do objeto. A luz ambiente sombreia toda a superfície e a luz difusa ajuda a revelar a forma do objeto 3D, conforme mostrado na ilustração a seguir.

Ilustração de uma esfera com iluminação difusa e iluminação ambiente

A iluminação difusa é mais intensa para se calcular do que a iluminação ambiente. Como ela depende das normais de vértice e da direção da luz, você pode ver a geometria de objetos no espaço 3D, o que produz uma iluminação mais realística do que a iluminação ambiente. Você pode usar realces especulares para obter uma aparência mais realista.

Matemática da Iluminação