ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



         

Свет и тень - часть 6


Другой параметр, величину которого также можно регулировать, — затухание. Он влияет на убывание интенсивности света с расстоянием. В квадратное уравнение, определяющее интенсивность света, входят три параметра. В документации по DirectSD они названы постоянной, линейной и квадратичной составляющими. По умолчанию им присваиваются значения 1, 0 и 0 соответственно — интенсивность света от такого источника не убывает с расстоянием. Уравнение, определяющее величину затухания, выглядит следующим образом:

а = с + Id + qd2,

где а — величина затухания; с — постоянная составляющая; 1 — линейная составляющая; d — расстояние от источника света, a q — квадратичная составляющая. Для того чтобы изменить затухание источника света, можно воспользоваться функцией C3dlight::SetAttenuation.

Хватит разговоров — давайте программировать

Хорошо, что вы меня остановили! Я заговорил на свою любимую тему, о физике, а подобных вещей никогда не следует допускать. Вы даже не успеете понять, что случилось, а я уже начну разглагольствовать о дифракционных решетках и волновых пакетах.

Поскольку программная реализация источников света выглядит довольно просто и не сильно отличается для различных типов освещения, я приведу код только для создания параллельно-точечного источника света на Рисунок 10-4.

void CMainFrame::OnEditParlight() {

C3dParPtLight* pLight = new CSdParPtLight;

pLight-»Create (1, 1, 1);

m_pCurLight = pLight;

// Создать фигуру, изображающую источник света C3dShape* psi = new C3dShape;

psl-»CreateCube (0.2) ;

// Присоединить источник света в качестве потомка фигуры, 242 аШУ Глава 10. Свет и тень

// чтобы его можно было выбрать psl-»AddChild(pLight) ;

// Присоединить источник света к макету m_pScene-»AddChild(psl) ;

m pScene-»m_ShapeList. Append (psi) ;

m pScene-»m_ShapeList. Append (pLight) ;

// Поместить источник света на видном месте psl-»SetPosition(0, 1, -2);

psl-»SetName ("Parallel Point Light");

MakeCurrent(psi) ;

}

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




Содержание  Назад  Вперед