Iluminação especular (Direct3D 9)
A reflexão especular de modelagem 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 visualizador. O sistema usa uma versão simplificada do modelo de reflexo especular Phong, que utiliza um vetor de metade para aproximar a intensidade da reflexão especular.
O estado de iluminação padrão não calcula os realces especulares. Para habilitar a iluminação especular, defina D3DRS_SPECULARENABLE como TRUE.
Equação de Iluminação Especular
A Iluminação Especular é descrita pela seguinte equação:
Iluminação Especular = Cs * sum[Ls * (N · H)P * Atten * Spot]
A tabela a seguir identifica as variáveis, seus tipos e seus intervalos.
Parâmetro | Valor padrão | Type | Descrição |
---|---|---|---|
Cₛ | (0,0,0,0) | D3DCOLORVALUE | Cor especular. |
Sum | N/D | N/D | Referência do componente especular cada da luz. |
N | N/D | D3DVECTOR | Normal de vértice. |
H | N/D | D3DVECTOR | Vetor de metade. Consulte a seção sobre o vetor de metade. |
P | 0.0 | FLOAT | Potência de reflexão especular. Intervalo é 0 até + infinito |
Lₛ | (0,0,0,0) | D3DCOLORVALUE | Cor especular clara. |
Atten | N/D | FLOAT | Valor de atenuação clara. 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 Cₛ é:
if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
C = color1;
- cor do vértice1, se a fonte de material especular for D3DMCS_COLOR1 e a primeira cor de vértice for fornecida na declaração de vértice.
- cor do vértice2, se a fonte de material especular for D3DMCS_COLOR2 e a segunda cor de vértice for fornecida na declaração de vértice.
- cor especular do material
Observação
Se uma das opções de origem do material especular for usada e a cor do vértice não for fornecida, a cor especular do material será usada.
Componentes especulares são vinculados para estar entre 0 e 255, depois que todas as luzes são processadas e interpoladas separadamente.
O vetor de metade
O vetor de metade (H) existe situado 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 de metade. Quando D3DRS_LOCALVIEWER é definido como TRUE, o sistema calcula o vetor de metade 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 mostra isso.
H = norm(norm(Cp - Vp) + Ldir)
Parâmetro | Valor padrão | Type | Descrição |
---|---|---|---|
Cₚ | N/D | D3DVECTOR | Posição da câmera. |
Vₚ | N/D | D3DVECTOR | Posição do vértice. |
Ldir | N/D | D3DVECTOR | Vetor de direção da posição de vértice para a posição da luz. |
Determinar o vetor de metade dessa maneira pode ser computacionalmente intensa. Como alternativa, definir D3DRS_LOCALVIEWER = FALSE instrui o sistema a agir como se o ponto de vista estivesse infinitamente distante no eixo z. Isso se reflete na seguinte fórmula.
H = norm((0,0,1) + Ldir)
Essa configuração é computacionalmente menos intensa, mas muito menos precisa, portanto, é melhor usada por aplicativos que usam a projeção ortogonal.
Exemplo
Neste exemplo, o objeto é colorido usando a cor da luz especular da cena e uma cor especular 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 );
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 da luz.
A ilustração a seguir mostra a cor do material especular, que é cinza, e a cor da luz especular, que é branca.
O destaque especular resultante é mostrado na ilustração a seguir.
Combinar o realce especular com a iluminação ambiente e difusa produz a ilustração a seguir. Com todos os três tipos de iluminação aplicada, isso mais claramente se parece com um objeto realista.
A iluminação especular é mais intensa para se calcular do que a iluminação difusa. Ela normalmente é usada para fornecer dicas visuais sobre o material da superfície. O realce especular varia em tamanho e cor com o material da superfície.
Tópicos relacionados