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.
O destaque especular resultante é mostrado na ilustração a seguir.
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.
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.
Tópicos relacionados