Материалы (Direct3D 9)
Материалы описывают, как многоугольники отражают свет или, как представляется, выдают свет в трехмерной сцене. Свойства материала подробно описывают диффузное отражение материала, отражение окружающей среды, выбросы света и характеристики зрителя. Direct3D использует структуру D3DMATERIAL9 для передачи всех сведений о свойствах материала. За исключением спектрированного свойства, каждое свойство описывается как цвет RGBA, представляющий, сколько из красной, зеленой и синей частей заданного типа света он отражает, а также альфа-смешивающий фактор.
Диффузное и внешнее отражение
Диффузные и внешние элементы структуры D3DMATERIAL9 описывают, как материал отражает внешний и диффузный свет в сцене. Поскольку большинство сцен содержат гораздо более рассеянный свет, чем внешний свет, диффузное отражение играет большую роль в определении цвета. Кроме того, поскольку диффузный свет направлен, угол частоты для диффузного света влияет на общую интенсивность отражения. Диффузное отражение наибольшее, когда свет ударяет вершину параллельно с нормальной вершиной. По мере увеличения угла эффект диффузного отражения уменьшается. Объем света отражается в косине угла между входящим светом и нормальной вершиной, как показано на следующем рисунке.
Внешнее отражение, например внешний свет, является ненаправленным. Внешнее отражение имеет меньшее влияние на видимый цвет отрисованного объекта, но он влияет на общий цвет и наиболее заметно, когда мало или нет диффузного света отражается от материала. Внешнее отражение материала влияет на внешний набор света для сцены путем вызова метода IDirect3Device9::SetRenderState с флагом D3DRS_AMBIENT.
Диффузное и внешнее отражение работают вместе, чтобы определить предполагаемый цвет объекта и обычно являются идентичными значениями. Например, для отрисовки синего кристаллического объекта создается материал, который отражает только синий компонент диффузного и внешнего света. При размещении в комнате с белым светом кристалл, как представляется, синий. Тем не менее, в комнате, которая имеет только красный свет, тот же кристалл, как представляется, черный, потому что его материал не отражает красный свет.
Эмиссия
Материалы можно использовать для создания отрисованного объекта, как представляется, самосветяющегося. Элемент D3DMATERIAL9 структуры используется для описания цвета и прозрачности излучаемого света. Выброс влияет на цвет объекта и может, например, сделать темный материал более ярким и принимать участие в излучаемом цвете.
Чтобы добавить иллюзию, что объект генерирует свет, не вызывая вычислительные расходы на добавление света в сцену, можно использовать имитное свойство материала. В случае синего кристалла свойство имисивного свойства полезно, если вы хотите сделать кристалл светом, но не лить свет на другие объекты в сцене. Помните, что материалы с эмистивными свойствами не выдают свет, который может отражаться другими объектами в сцене. Чтобы достичь этого отраженного света, необходимо разместить дополнительный свет в сцене.
Зеркальное отражение
Спекулярное отражение создает выделения на объектах, что делает их блестящими. Структура D3DMATERIAL9 содержит два элемента, описывающие цвет зрителя, а также общую блестящость материала. Вы устанавливаете цвет зрителя, задав для элемента Specular нужный цвет RGBA - наиболее распространенные цвета — белые или светло-серые. Значения, заданные в элементе Power, определяют, насколько острыми являются зриемые эффекты.
Спекулярные выделения могут создавать драматические эффекты. Рисование снова на синей кристаллической аналогии: большее значение Power создает более острые зрители, что делает кристалл, как представляется, довольно блестящим. Меньшие значения увеличивают область эффекта, создавая тупое отражение, которое делает кристалл выглядит морозным. Чтобы сделать объект действительно матовым, задайте элемент Power равным нулю, а цвет в specular — черным. Экспериментируйте с различными уровнями отражения, чтобы создать реалистичный внешний вид для ваших потребностей. На следующем рисунке показаны две идентичные модели. В левой части экрана используется 10 очковая мощность отражения; Модель справа не имеет зеркального отражения.
Настройка свойств материала
Устройства отрисовки Direct3D могут отображаться с помощью одного набора свойств материала одновременно.
В приложении C++ необходимо задать свойства материала, которые использует система, подготовив структуру D3DMATERIAL9, а затем вызовите метод IDirect3Device9::Set Material.
Чтобы подготовить структуру 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 примените свойства путем вызова метода IDirect3Device9::SetMaterial устройства отрисовки. Этот метод принимает адрес подготовленной структуры D3DMATERIAL9 в качестве единственного параметра. При необходимости можно вызвать IDirect3DDevice9::Set Material с новыми сведениями, чтобы обновить свойства материала для устройства. В следующем примере кода показано, как это может выглядеть в коде.
// 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::Get Material для устройства. В отличие от метода IDirect3DDevice9::SetMaterial, IDirect3Device9::GetMaterial не требует подготовки. Метод IDirect3Device9::Get Material принимает адрес структуры 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.
}
Заметка
Если приложение не указывает свойства материала для отрисовки, система использует материал по умолчанию. Материал по умолчанию отражает весь диффузный свет - белый, например , без внешнего или зрительного отражения, и без эмистивного цвета.
Связанные разделы