Фактически для построения карты освещенности грани (подробнее этот процесс будет рассмотрен далее) на грани выбирается набор точек (соответствующий пикселам текстуры, пикселы карты освещенности обычно называются люмелями, lumels). Далее из каждой из этих точек выпускаются лучи ко всем источникам света и определяется вклад всех видимых источников света. При этом учитываются тени, расстояние до каждого источника, его цвет и т. п.

В игре Quake использовались карты освещенности в градациях серого цвета, а в Quake II и Quake III Arena - полноценные 24-битовые цветные текстуры.

Рассмотрим программную реализацию карт освещенности.

Каждый источник света мы будем представлять в виде экземпляра класса Light, приводимого ниже. Каждый такой источник света будет описываться своим положением в пространстве (pos), цветом (color), интенсивностью (brightness) и радиусом влияния источника radius (вне него вклад источника будет игнорироваться).

Для описания влияния расстояния до источника на интенсивность света будем использовать следующий закон:

Для учета ориентации грани по отношению к источнику света мы будем использовать закон диффузного освещения:

/ =/coscp-/(</), (10.2)

где / - интенсивность источника света; ср - угол между направлением на источник света и направлением нормали в точке.

Ниже приводится описание соответствующего класса.

-I
class Light : public VisualObject {
protected:
float brightness; // how bright is light source float radius; // it's effective radius
float a; // constant part of inverse
// attenuation float b; // linear part of inverse
// attenuation float c; // square part of inverse
// attenuation
public:
Light ( const char * theName, const Vector3D& thePos, const Vector4DS: theColor, float br, float rad, float constant, float linear, float square );
float getBrightness () const {
return brightness;
}
float getRadius () const {
return radius,-
}
Vector3D getLightAt ( const Vector3D& point,

⇐ Предыдущая| |Следующая ⇒