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 usa la estructura D3DMATERIAL9 para llevar toda la información de propiedad del material. Con la excepción de la propiedad especular, cada propiedad se describe como un color RGBA que representa la cantidad de las partes rojas, verdes y azules de un tipo determinado de luz que refleja y un factor de combinación 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 para 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.
La reflexión ambiental, como la luz ambiental, no es direccionional. La reflexión ambiental tiene un menor impacto 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 parecería 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 usa 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 emissiva 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 emissiva 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, lo que hace 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 se establecen en el control Miembro de energía son los efectos especulares más agudos.
Los resaltados especulares pueden crear efectos dramáticos. Dibujar de nuevo en la analogía de cristal azul: un valor power más grande crea resaltados especulares más afilados, 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 helado. 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 generar una apariencia realista para sus necesidades. En la ilustración siguiente se muestran dos modelos idénticos. El de la izquierda utiliza una potencia especular de reflexión de 10; el modelo de la derecha no tiene reflexión especular.
Establecer propiedades de 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 preparando una estructura de D3DMATERIAL9 y, a continuación, llamando al método IDirect3DDevice9::SetMaterial.
Para preparar la estructura de 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 afilados.
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 de 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. Puede 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 |
---|---|
Difuso | (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) |
Emissive | (R:0, G:0, B:0, A:0) |
Poder | (0.0) |
Recuperación de propiedades de material
Recupera las propiedades de material que el dispositivo de representación usa 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 de D3DMATERIAL9 y rellena la estructura proporcionada con información que describe las propiedades del material actuales antes de devolver.
// 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.
Temas relacionados