Materiales (Direct3D 9)

Los materiales describen cómo los polígonos reflejan la luz o parecen emitir luz en una escena 3D. Las propiedades del material detallan la reflexión difusa de un material, la reflexión ambiental, la emisión de luz y las características de resaltado especular. Direct3D utiliza la estructura D3DMATERIAL9 para llevar toda la información de propiedad material. A excepción de la propiedad especular, cada propiedad se describe como un color RGBA que representa la cantidad de partes rojas, verdes y azules de un tipo determinado de luz que refleja y un factor de mezcla alfa.

Reflexión difusa y ambiental

Los miembros difusos y ambientales de la estructura D3DMATERIAL9 describen cómo un material refleja la luz ambiental y difusa en una escena. Dado que la mayoría de las escenas contienen mucha más luz difusa que la luz ambiente, la reflexión difusa juega la parte más grande para determinar el color. Además, dado que la luz difusa es direccional, el ángulo de incidencia de la luz difusa afecta a la intensidad general de la reflexión. La reflexión difusa es mayor cuando la luz golpea un vértice paralelo al vértice normal. A medida que aumenta el ángulo, el efecto de la reflexión difusa disminuye. La cantidad de luz reflejada es el coseno del ángulo entre la luz entrante y el vértice normal, como se muestra en la ilustración siguiente.

ilustración de la cantidad de luz reflejada

La reflexión ambiental, como la luz ambiente, no es direccioniva. La reflexión ambiental tiene un impacto menor en el color aparente de un objeto representado, pero afecta al color general y es más notable cuando poca o ninguna luz difusa refleja el material. La reflexión ambiental de un material se ve afectada por el conjunto de luz ambiente de una escena llamando al método IDirect3DDevice9::SetRenderState con la marca D3DRS_AMBIENT.

La reflexión difusa y ambiental funcionan conjuntamente para determinar el color percibido de un objeto y suelen ser valores idénticos. Por ejemplo, para representar un objeto cristalino azul, se crea un material que refleja solo el componente azul de la luz difusa y ambiente. Cuando se coloca en una habitación con una luz blanca, el cristal parece ser azul. Sin embargo, en una habitación que solo tiene luz roja, el mismo cristal parece ser negro, porque su material no refleja la luz roja.

Emisión

Los materiales se pueden usar para hacer que un objeto representado parezca ser autoluminoso. El miembro Emissive de la estructura D3DMATERIAL9 se utiliza para describir el color y la transparencia de la luz emitida. La emisión afecta al color de un objeto y puede, por ejemplo, hacer que un material oscuro sea más brillante y tomar parte del color emitido.

Puede usar la propiedad emisiva de un material para agregar la ilusión de que un objeto emite luz, sin incurrir en la sobrecarga computacional de agregar una luz a la escena. En el caso del cristal azul, la propiedad emisiva es útil si desea hacer que el cristal parezca iluminarse, pero no poner luz sobre otros objetos de la escena. Recuerde que los materiales con propiedades emisivas no emiten luz que otros objetos de una escena pueden reflejar. Para lograr esta luz reflejada, debe colocar una luz adicional dentro de la escena.

Reflexión especular

La reflexión especular crea resaltados en objetos, haciendo que aparezcan brillantes. La estructura D3DMATERIAL9 contiene dos miembros que describen el color de resaltado especular, así como la brillo general del material. Establece el color de los resaltados especulares estableciendo el miembro especular en el color RGBA deseado: los colores más comunes son blanco o gris claro. Los valores que establezca en el control Miembro de energía cuán agudos son los efectos especulares.

Los resaltados especulares pueden crear efectos dramáticos. Dibujar de nuevo en la analogía de cristal azul: un valor de potencia más grande crea resaltados especulares más agudos, lo que hace que el cristal parezca bastante brillante. Los valores más pequeños aumentan el área del efecto, creando una reflexión opaca que hace que el cristal parezca escarcha. Para que un objeto sea verdaderamente mate, establezca el miembro Power en cero y el color de Specular en negro. Experimente con diferentes niveles de reflexión para producir una apariencia realista para sus necesidades. En la ilustración siguiente se muestran dos modelos idénticos. El de la izquierda utiliza una potencia de reflexión especular de 10; el modelo de la derecha no tiene reflexión especular.

ilustración de modelos de reflexión especular

Establecer las propiedades del material

Los dispositivos de representación de Direct3D pueden representarse con un conjunto de propiedades de material a la vez.

En una aplicación de C++, se establecen las propiedades de material que usa el sistema mediante la preparación de una estructura D3DMATERIAL9 y, a continuación, se llama al método IDirect3DDevice9::SetMaterial .

Para preparar la estructura D3DMATERIAL9 para su uso, establezca la información de propiedad en la estructura para crear el efecto deseado durante la representación. En el ejemplo de código siguiente se configura la estructura D3DMATERIAL9 para un material púrpura con resaltados especulares blancos agudos.

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;

Después de preparar la estructura D3DMATERIAL9 , aplique las propiedades llamando al método IDirect3DDevice9::SetMaterial del dispositivo de representación. Este método acepta la dirección de una estructura D3DMATERIAL9 preparada como único parámetro. Puedes llamar a IDirect3DDevice9::SetMaterial con nueva información según sea necesario para actualizar las propiedades de material del dispositivo. En el ejemplo de código siguiente se muestra cómo podría tener este aspecto en el 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.
}

Al crear un dispositivo Direct3D, el material actual se establece automáticamente en el valor predeterminado que se muestra en la tabla siguiente.

Miembro 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)
Emisor de luz (R:0, G:0, B:0, A:0)
Potencia (0.0)

 

Recuperar propiedades de material

Recupera las propiedades de material que el dispositivo de representación está usando actualmente mediante una llamada al método IDirect3DDevice9::GetMaterial para el dispositivo. A diferencia del método IDirect3DDevice9::SetMaterial , IDirect3DDevice9::GetMaterial no requiere preparación. El método IDirect3DDevice9::GetMaterial acepta la dirección de una estructura D3DMATERIAL9 y rellena la estructura proporcionada con información que describe las propiedades del material actuales antes de devolverlas.

// 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.
}

Nota

Si la aplicación no especifica propiedades de material para la representación, el sistema usa un material predeterminado. El material predeterminado refleja toda la luz difusa - blanco, por ejemplo - sin reflexión ambiental o especular, y sin color emisivo.

 

Luces y materiales