Compartilhar via


Materiais (Direct3D 9)

Os materiais descrevem como os polígonos refletem a luz ou parecem emitir luz em uma cena 3D. As propriedades do material detalham as características de reflexão difusa, reflexão ambiente, emissão de luz e realce especular de um material. O Direct3D usa a estrutura D3DMATERIAL9 para transportar todas as informações de propriedade material. Com exceção da propriedade especular, cada propriedade é descrita como uma cor RGBA que representa quanto das partes vermelhas, verdes e azuis de um determinado tipo de luz ela reflete e um fator de combinação alfa.

Reflexão difusa e ambiente

Os membros difusos e ambientes da estrutura D3DMATERIAL9 descrevem como um material reflete a luz ambiente e difusa em uma cena. Como a maioria das cenas contém muito mais luz difusa do que a luz ambiente, a reflexão difusa desempenha o maior papel na determinação da cor. Além disso, como a luz difusa é direcional, o ângulo de incidência de luz difusa afeta a intensidade geral do reflexo. A reflexão difusa é maior quando a luz atinge um vértice paralelo ao vértice normal. À medida que o ângulo aumenta, o efeito da reflexão difusa diminui. A quantidade de luz refletida é o cosseno do ângulo entre a luz de entrada e o vértice normal, conforme mostrado na ilustração a seguir.

ilustração da quantidade de luz refletida

A reflexão ambiente, como a luz ambiente, não é direcional. A reflexão ambiente tem um impacto menor na cor aparente de um objeto renderizado, mas afeta a cor geral e é mais perceptível quando pouca ou nenhuma luz difusa reflete fora do material. A reflexão ambiente de um material é afetada pelo conjunto de luz ambiente de uma cena chamando o método IDirect3DDevice9::SetRenderState com o sinalizador D3DRS_AMBIENT.

A reflexão difusa e ambiente trabalha em conjunto para determinar a cor percebida de um objeto e geralmente são valores idênticos. Por exemplo, para renderizar um objeto cristalino azul, você cria um material que reflete apenas o componente azul da luz difusa e ambiente. Quando colocado em uma sala com uma luz branca, o cristal parece ser azul. No entanto, em uma sala que tem apenas luz vermelha, o mesmo cristal parece ser preto, porque seu material não reflete a luz vermelha.

Emissão

Os materiais podem ser usados para fazer com que um objeto renderizado pareça ser auto-luminoso. O membro emissivo da estrutura D3DMATERIAL9 é usado para descrever a cor e a transparência da luz emitida. A emissão afeta a cor de um objeto e pode, por exemplo, tornar um material escuro mais claro e adotar parte da cor emitida.

Você pode usar a propriedade emissiva de um material para adicionar a ilusão de que um objeto está emitindo luz, sem incorrer na sobrecarga computacional de adicionar uma luz à cena. No caso do cristal azul, a propriedade emissiva será útil se você quiser fazer com que o cristal pareça se iluminar, mas não lançar luz sobre outros objetos na cena. Lembre-se de que materiais com propriedades emissivas não emitem luz que possa ser refletida por outros objetos em uma cena. Para obter essa luz refletida, você precisa colocar uma luz adicional dentro da cena.

Reflexão especular

A reflexão especular cria realces em objetos, fazendo com que eles pareçam brilhantes. A estrutura D3DMATERIAL9 contém dois membros que descrevem a cor de realce especular, bem como a brilho geral do material. Estabeleça a cor dos realces especulares definindo o membro Especular como a cor RGBA desejada– as cores mais comuns são branco ou cinza claro. Os valores definidos no membro Power controlam a nitidez dos efeitos especular.

Realces especular podem criar efeitos dramáticos. Desenhando novamente na analogia cristalina azul: um valor de energia maior cria realces especular mais nítidos, fazendo com que o cristal pareça ser bastante brilhante. Valores menores aumentam a área do efeito, criando um reflexo maçante que faz o cristal parecer gelado. Para tornar um objeto realmente fosco, defina o membro Power como zero e a cor em Especular como preto. Experimente diferentes níveis de reflexão para produzir uma aparência realista para suas necessidades. A ilustração a seguir mostra dois modelos idênticos. O à esquerda usa um poder de reflexão especular de 10; o modelo à direita não tem reflexão especular.

ilustração de modelos de reflexão especular

Definindo propriedades do material

Os dispositivos de renderização Direct3D podem ser renderizados com um conjunto de propriedades de material por vez.

Em um aplicativo C++, você define as propriedades de material que o sistema usa preparando uma estrutura D3DMATERIAL9 e, em seguida, chamando o método IDirect3DDevice9::SetMaterial .

Para preparar a estrutura D3DMATERIAL9 para uso, defina as informações de propriedade na estrutura para criar o efeito desejado durante a renderização. O exemplo de código a seguir configura a estrutura D3DMATERIAL9 para um material roxo com realces especuladores brancos afiados.

D3DMATERIAL9 mat;

// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;

// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;

// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;

// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;

Depois de preparar a estrutura D3DMATERIAL9 , você aplica as propriedades chamando o método IDirect3DDevice9::SetMaterial do dispositivo de renderização. Esse método aceita o endereço de uma estrutura D3DMATERIAL9 preparada como seu único parâmetro. Você pode chamar IDirect3DDevice9::SetMaterial com novas informações conforme necessário para atualizar as propriedades de material do dispositivo. O exemplo de código a seguir mostra como isso pode ser exibido no código.

// This code example uses the material properties defined for 
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Quando você cria um dispositivo Direct3D, o material atual é definido automaticamente como o padrão mostrado na tabela a seguir.

Membro Valor
Difusa (R:0, G:0, B:0, A:0)
Especular (R:0, G:0, B:0, A:0)
Ambiente (R:0, G:0, B:0, A:0)
Emissiva (R:0, G:0, B:0, A:0)
Energia (0.0)

 

Recuperando propriedades de material

Você recupera as propriedades de material que o dispositivo de renderização está usando no momento chamando o método IDirect3DDevice9::GetMaterial para o dispositivo. Ao contrário do método IDirect3DDevice9::SetMaterial , IDirect3DDevice9::GetMaterial não requer preparação. O método IDirect3DDevice9::GetMaterial aceita o endereço de uma estrutura D3DMATERIAL9 e preenche a estrutura fornecida com informações que descrevem as propriedades do material atual antes de retornar.

// For this example, the pd3dDev variable is assumed to 
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;

hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Observação

Se o aplicativo não especificar propriedades materiais para renderização, o sistema usará um material padrão. O material padrão reflete toda a luz difusa - branca, por exemplo - sem reflexão ambiente ou especular e sem cor emissiva.

 

Luzes e materiais