Partilhar via


Iluminação especular (Direct3D 9)

Modelar a reflexão especular requer que o sistema não só saiba em que direção a luz está viajando, mas também a direção para o olho do espectador. O sistema usa uma versão simplificada do modelo de reflexão especular Phong, que emprega um vetor intermediário para aproximar a intensidade da reflexão especular.

O estado de iluminação padrão não calcula os destaques especulares. Para ativar a iluminação especular, certifique-se de definir D3DRS_SPECULARENABLE para TRUE.

Equação de iluminação especular

A Iluminação Especular é descrita pela seguinte equação:

Iluminação especular = Cₛ * soma[Lₛ * (N · H)P * Atten * Spot]

 

A tabela a seguir identifica as variáveis, seus tipos e seus intervalos.

Parâmetro Valor padrão Tipo Descrição
Cs (0,0,0,0) D3DCOLORVALUE Cor especular.
soma N/A N/A Soma do componente especular de cada luz.
N N/A D3DVECTOR Vértice normal.
H N/A D3DVECTOR Vetor a meio caminho. Veja a seção sobre o vetor intermediário.
P 0.0 FLUTUAR Poder de reflexão especular. O intervalo é de 0 a +infinito
Ls (0,0,0,0) D3DCOLORVALUE Cor clara especular.
Atten N/A FLUTUAR Valor de atenuação da luz. Consulte Atenuação e Fator de Destaque (Direct3D 9).
Ponto N/A FLUTUAR Fator de destaque. Consulte Atenuação e Fator de Destaque (Direct3D 9).

 

O valor para Cs é um dos seguintes:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • cor do vértice 1, se a fonte de material especular for D3DMCS_COLOR1 e a primeira cor do vértice for fornecida na declaração do vértice.
  • cor do vértice2, se a fonte do material especular for D3DMCS_COLOR2, e a segunda cor do vértice for fornecida na declaração do vértice.
  • cor especular do material

Observação

Se qualquer opção de fonte de material especular é usada e a cor do vértice não é fornecida, então a cor especular do material é usada.

 

Os componentes especulares são fixados para serem de 0 a 255, depois que todas as luzes são processadas e interpoladas separadamente.

O vetor intermediário

O vetor intermediário (H) existe no meio do caminho entre dois vetores: o vetor de um vértice de objeto para a fonte de luz, e o vetor de um vértice de objeto para a posição da câmera. O Direct3D fornece duas maneiras de calcular o vetor intermediário. Quando D3DRS_LOCALVIEWER é definido como TRUE, o sistema calcula o vetor intermediário usando a posição da câmera e a posição do vértice, juntamente com o vetor de direção da luz. A fórmula a seguir ilustra isso.

H = norm(norm(Cp - Vp) + Ldir)

 

Parâmetro Valor padrão Tipo Descrição
CP N/A D3DVECTOR Posição da câmara.
Vp N/A D3DVECTOR Posição do vértice.
Ldir N/A D3DVECTOR Vetor de direção da posição do vértice para a posição da luz.

 

Determinar o vetor intermediário dessa maneira pode ser computacionalmente intensivo. Como alternativa, definir D3DRS_LOCALVIEWER = FALSE instrui o sistema a agir como se o ponto de vista estivesse infinitamente distante no eixo z. Isto reflete-se na fórmula seguinte.

H = norm((0,0,1) + Ldir)

 

Esta configuração é menos intensiva computacionalmente, mas muito menos precisa, por isso é melhor usada por aplicações que usam projeção ortogonal.

Exemplo

Neste exemplo, o objeto é colorido usando a cor de luz especular da cena e uma cor especular do 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 );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, 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 clara.

As duas ilustrações a seguir mostram a cor do material especular, que é cinza, e a cor clara especular, que é branca.

ilustração de uma esfera cinzenta ilustração de uma esfera branca

O destaque especular resultante é mostrado na ilustração a seguir.

ilustração do destaque especular

A combinação do destaque especular com a iluminação ambiente e difusa produz a ilustração a seguir. Com todos os três tipos de iluminação aplicados, isso se assemelha mais claramente a um objeto realista.

ilustração da combinação do destaque especular, iluminação ambiente e iluminação difusa

A iluminação especular é mais exigente de calcular do que a iluminação difusa. É normalmente usado para fornecer pistas visuais sobre o material da superfície. O destaque especular varia em tamanho e cor com o material da superfície.

Matemática da Iluminação