Поделиться через


Материалы (Direct3D 9)

Материалы описывают, как многоугольник отражает свет или излучает свет в трехмерной сцене. Свойства материала подробно описывают характеристики диффузного отражения, внешнего отражения, выбросов света и зеркального выделения. Direct3D использует структуру D3DMATERIAL9 для передачи всех сведений о свойствах материала. За исключением зеркального свойства, каждое свойство описывается как цвет RGBA, который представляет, сколько красных, зеленых и синих частей данного типа света оно отражает, и альфа-коэффициент смешения.

Диффузное и внешнее отражение

Элементы диффузного и окружающего элементов структуры D3DMATERIAL9 описывают, как материал отражает окружающий и рассеянный свет в сцене. Поскольку большинство сцен содержат гораздо больше рассеянного света, чем окружающий свет, диффузное отражение играет большую роль в определении цвета. Кроме того, поскольку диффузный свет направлен, угол падения диффузного света влияет на общую интенсивность отражения. Диффузное отражение наибольшее, когда свет попадает в вершину, параллельную нормальной вершине. По мере увеличения угла эффект диффузного отражения уменьшается. Количество отраженного света — это косиус угла между входящим светом и нормой вершины, как показано на следующем рисунке.

иллюстрация количества отраженного света

Внешнее отражение, как и внешний свет, является ненаправленным. Внешнее отражение оказывает меньшее влияние на видимый цвет отрисованного объекта, но оно влияет на общий цвет и является наиболее заметным, когда мало или нет рассеянного света отражается от материала. На внешнее отражение материала влияет внешний свет, заданный для сцены путем вызова метода IDirect3DDevice9::SetRenderState с флагом D3DRS_AMBIENT.

Диффузное и внешнее отражение совместно определяют воспринимаемый цвет объекта и обычно являются идентичными значениями. Например, для отрисовки синего кристаллического объекта создается материал, который отражает только синий компонент рассеянного и окружающего света. При помещении в комнате с белым светом, кристалл кажется синим. Тем не менее, в комнате, которая имеет только красный свет, тот же кристалл будет казаться черным, потому что его материал не отражает красный свет.

Выбросов

Материалы можно использовать для того, чтобы отрисованный объект казался самосветящимся. Элемент Emissive структуры D3DMATERIAL9 используется для описания цвета и прозрачности излучаемого света. Излучение влияет на цвет объекта и может, например, сделать темный материал ярче и частично перенять излучаемый цвет.

Можно использовать излучающее свойство материала, чтобы создать иллюзию того, что объект излучает свет, не влечет за собой вычислительные издержки при добавлении света в сцену. В случае с голубым кристаллом свойство emissive полезно, если вы хотите, чтобы кристалл казалось светом, но не излучает свет на другие объекты в сцене. Помните, что материалы с излучаемыми свойствами не излучают свет, который может отражаться другими объектами в сцене. Чтобы добиться этого отраженного света, необходимо поместить дополнительный свет в сцену.

Зеркальное отражение

Зеркальное отражение создает выделения на объектах, делая их блестящими. Структура D3DMATERIAL9 содержит два элемента, которые описывают цвет зеркального выделения, а также общую блескность материала. Цвет зеркальных выделений определяется путем установки нужного цвета RGBA для элемента "Зеркальное изображение". Наиболее распространенные цвета : белый или светло-серый. Значения, заданные в элементе Power, определяют, насколько резкими являются зеркальные эффекты.

Зеркальные блики могут создавать драматические эффекты. Рисунок снова на сине-кристаллической аналогии: большее значение Power создает более резкие зеркальные блики, что делает кристалл казаться довольно блестящим. Меньшие значения увеличивают площадь эффекта, создавая скучное отражение, которое делает кристалл выглядит морозным. Чтобы сделать объект по-настоящему матовым, установите для элемента Power значение 0, а цвет в параметре Зеркальный — черный. Поэкспериментируйте с различными уровнями отражения, чтобы создать реалистичный внешний вид для ваших потребностей. На следующем рисунке показаны две идентичные модели. Один слева использует зеркальную силу отражения 10; модель справа не имеет зеркального отражения.

иллюстрация моделей отражения

Настройка свойств материала

Устройства отрисовки Direct3D могут одновременно выполнять отрисовку с одним набором свойств материала.

В приложении C++ можно задать свойства материала, которые использует система, подготовив структуру D3DMATERIAL9 и вызвав метод IDirect3DDevice9::SetMaterial .

Чтобы подготовить структуру D3DMATERIAL9 к использованию, задайте сведения о свойстве в структуре, чтобы создать требуемый эффект во время отрисовки. В следующем примере кода настраивается структура D3DMATERIAL9 для фиолетового материала с резкими белыми блочками.

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;

После подготовки структуры D3DMATERIAL9 свойства применяются путем вызова метода IDirect3DDevice9::SetMaterial устройства отрисовки. Этот метод принимает адрес подготовленной структуры D3DMATERIAL9 в качестве единственного параметра. Вы можете вызвать IDirect3DDevice9::SetMaterial с новыми сведениями, необходимыми для обновления свойств материала для устройства. В следующем примере кода показано, как это может выглядеть в коде.

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

При создании устройства Direct3D для текущего материала автоматически устанавливается значение по умолчанию, показанное в следующей таблице.

Член Значение
Диффузное (R:0, G:0, B:0, A:0)
Отражающее (R:0, G:0, B:0, A:0)
Окружающее (R:0, G:0, B:0, A:0)
Эмиссионное (R:0, G:0, B:0, A:0)
Мощный (0.0)

 

Получение свойств материала

Свойства материала, которые в настоящее время использует устройство отрисовки, извлекаются путем вызова метода IDirect3Device9::GetMaterial для устройства. В отличие от метода IDirect3DDevice9::SetMaterial , IDirect3DDevice9::GetMaterial не требует подготовки. Метод IDirect3DDevice9::GetMaterial принимает адрес структуры D3DMATERIAL9 и заполняет предоставленную структуру сведениями, описывающими текущие свойства материала перед возвратом.

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

Примечание

Если приложение не указывает свойства материала для отрисовки, система использует материал по умолчанию. Материал по умолчанию отражает весь рассеянный свет , например белый, без внешнего или зеркального отражения, а также без излучающего цвета.

 

Свет и материалы