Remaining
В этом разделе по мере возможности будут изучаться оставшиеся не рассмотренными методы библиотеки OpenGL. Важный класс методов относится к категории "Освещение" (lighting). Методы этой категории позволяют создать вполне реалистичное изображение объектов путем использования специальных формул расчета цветов пикселей, учитывающих освещение.
Модуль 5. Освещение (lighting)
Комплексной целью модуля является изучение следующих элементов OpenGL
-
В создании эффекта освещения принимают участие несколько методов. Один из них метод LightModel описывает режим освещения
-
Метод Material описывает реакцию объекта на освещение.
-
Метод ColorMaterial комбинирует заданные цвета вершин объекта с эффектом освещения.
-
Метод Light описывает свойства источников света
5.0 Среда и вещество
Освещение сцены и два дополнительных параметра освещения регулируются методом LightModel.
Метод LightModel
Заголовок этого метода имеет вид
///
/// Устанавливает цвет сцены и параметры модели освещения.
///
///
/// Определяет тип вводимых параметров.
/// Допустимы значения:
/// LIGHT_MODEL_AMBIENT - цвет освещенности сцены, или "окружения"
/// (по умолчанию (0.2, 0.2, 0.2, 1)),
/// LIGHT_MODEL_LOCAL_VIEWER - способ расчета угла зеркального отражения.
/// Значение 0 (по умолчанию) предполагает положение неподвижного наблюдателя
/// в начале системы координат наблюдения;
/// значение 1 предполагает, что наблюдатель смотрит в направлении, обратном оси z
/// объектной системы координат (локальный, или подвижный наблюдатель);
/// LIGHT_MODEL_TWO_SIDE – в расчет освещения принимаются цвета
/// отдельно для каждой поверхности (значение 1),
/// либо только одной – передней грани (значение 0). По умолчанию 0. ///
///
/// Массив значений параметров.
/// В случае LIGHT_MODEL_AMBIENT массив должен содержать 4 числа - цвет окружения,
/// в остальных случаях - по одному числу 0 или 1.
///
[DllImport("OPENGL32.DLL", EntryPoint = "glLightModelfv")]
public static extern void LightModel(int pname, float[] fparams);
Символьные константы, используемые как параметры метода LightModel, имеют значения
public const int LIGHT_MODEL_LOCAL_VIEWER = 0x0B51;
public const int LIGHT_MODEL_TWO_SIDE = 0x0B52;
public const int LIGHT_MODEL_AMBIENT = 0x0B53;
Для определения текущих значений параметров метода LightModel следует использовать метод Get с теми же константами в качестве параметров
gl.Get(gl.LIGHT_MODEL_AMBIENT, 4)[i] - цвет сцены, i = 0,1,2,3
gl.Get(gl.LIGHT_MODEL_TWO_SIDE, 1)[0]
gl.Get(gl.LIGHT_MODEL_LOCAL_VIEWER, 1)[0]
Для сохранения в стеке параметров освещения вообще и параметров метода LightModel в частности следует использовать метод PushAttrib с параметром
///
/// Маска битов параметров освещения.
///
public const int LIGHTING_BIT = 0x00000040;
Для активации метода LightModel в частности и освещения вообще следует использовать метод Enable с параметром
///
/// Параметр активации освещения для методов Enable, IsEnabled, Disable, Get
///
public const int LIGHTING = 0x0B50;
Тот же параметр используется методами Get и IsEnabled для определения состояния активации освещения.
Тест рубежного контроля
-
Опишите смысл параметров метода LightModel.
-
Какой метод возвращает текущие значения параметров метода LightModel?
-
Каков цвет среды по умолчанию?
-
Какой параметр следует использовать в методе PushAttrib с тем, чтобы сохранить состояние освещенности в стеке?
-
Каким методом активируется освещенность?
Метод Material
Метод Material определяет индивидуальные свойства реакции на освещенность материала изображаемого объекта. С его помощью можно определить цвет излучения обеих граней объекта - фронтальной и задней, цвета отражения любыми гранями окружающей составляющей света, диффузной составляющей и зеркальной составляющей. Наконец, метод Material определяет коэффициент отражения зеркальной составляющей света – так называемую яркость.
Так выглядит заголовок метода Material
///
/// Определяет параметры вещества объекта в режиме освещения.
///
///
/// Определяет грань многоугольника.
/// Допускает три значения FRONT, BACK или FRONT_AND_BACK.
///
///
/// Определяет тип параметров. Допускает значения:
/// AMBIENT- цвет отраженного света окружения (по умолчанию (0.2, 0.2, 0.2, 1)),
/// DIFFUSE - цвет диффузно отраженного света (по умолчанию (0.8, 0.8, 0.8, 1)),
/// SPECULAR - цвет зеркально отраженного света (по умолчанию (0, 0, 0, 1)),
/// EMISSION - цвет излученного света (по умолчанию (0, 0, 0, 1)),
/// SHININESS - коэффициент яркости в зеркальной составляющей;
/// значения SHININESS лежат в интервале [0; 128] (по умолчанию 0),
/// AMBIENT_AND_DIFFUSE - если цвета диффузно отраженного света
/// и света окружения совпадают.
///
///
/// Массив параметров. Размерность массива 1 в случае SHININESS. В остальных случаях - 4.
///
[DllImport("OPENGL32.DLL", EntryPoint = "glMaterialfv")]
public static extern void Material(int face, int name, float[] parameter);
Константы параметра name имеют вид
public const int AMBIENT = 0x1200;
public const int DIFFUSE = 0x1201;
public const int SPECULAR = 0x1202;
public const int EMISSION = 0x1600;
public const int SHININESS = 0x1601;
public const int AMBIENT_AND_DIFFUSE = 0x1602;
Для определения текущих значений параметров метода Material следует использовать метод GetMaterial
///
/// Определяет текущие значения параметров метода Material.
///
///
/// Тип грани FRONT или BACK
///
///
/// имя параметра AMBIENT, DIFFUSE, SPECULAR, EMISSION или SHININESS
///
///
/// Массив, в котором возвращается значение параметра запрашиваемого типа.
/// В случае цветов размер массива равен 4, а в случае SHININESS единице.
///
[DllImport("OPENGL32.DLL", EntryPoint = "glGetMaterialfv")]
public static extern void GetMaterial(int face, int pname, float[] fparams);
Метод Material активируется методом Enable с параметром LIGHTING.
Если ни один источник света не включен, и если отключена активность метода ColorMaterial (см. ниже), то цвет объекта при включенном освещении определяется как сумма цвета, излучаемого веществом ecm, и скалярного произведения цвета среды acs на цвет отраженного материалом света окружения acm. В частности, по умолчанию цвет всех вершин равен ecm + acsacm = (0, 0, 0, 1) + (0.2, 0.2, 0.2, 1)*(0.2, 0.2, 0.2, 1) = (0, 0, 0, 1) + (0.04, 0.04, 0.04, 1) = (0.04, 0.04, 0.04, 1). Диффузная составляющая, равно как и зеркальная составляющая объекта включаются в формулу цвета вершин объекта только при включенном источнике света.
Тест рубежного контроля
-
Опишите смысл параметров метода Material.
-
Какой метод определяет текущие значения параметров метода Material?
-
Какова интенсивность отражаемого света среды по умолчанию?
-
Какова интенсивность излучаемого света по умолчанию?
-
Каково значение цвета диффузно отражаемого света по умолчанию?
-
Каким методом активируется метод Material?
-
Можно ли придавать различные интенсивности, например, отражаемого света окружения, различным граням многоугольника?
-
При каком условии будет проявлять себя интенсивность отражаемого задней стороной многоугольника света окружения?
Метод ColorMaterial
Метод ColorMaterial при включенном освещении формирует цвета, указанные методом Color для каждой вершины отдельно. Его параметры определяют освещаемые грани и смысл цвета (излучение, отражение света сцены, диффузное отражение или зеркальное отражение), указанного методом Color. Вот заголовок метода ColorMaterial
///
/// Использует цвета вершин в качестве цветов вещества при включенном освещении.
///
///
/// Тип грани многоугольника. Допустимы значения FRONT, BACK или FRONT_AND_BACK.
/// По умолчанию FRONT_AND_BACK.
///
///
/// Тип цвета, которому отвечают цвета вершин.
/// Допустимы значения AMBIENT, DIFFUSE, SPECULAR, EMISSION и AMBIENT_AND_DIFFUSE.
/// По умолчанию AMBIENT_AND_DIFFUSE.
///
[DllImport("OPENGL32.DLL", EntryPoint = "glColorMaterial")]
public static extern void ColorMaterial(int face, int mode);
Определяет текущие значения параметров метода ColorMaterial метод Get в форме
(int)gl.Get(gl.COLOR_MATERIAL_FACE, 1)[0]
(int)gl.Get(gl.COLOR_MATERIAL_PARAMETER, 1)[0]
Константы-параметры метода Get имеют значения
///
/// Аргумент Get требует возврата значения 1 параметра -
/// символьной постоянной, определяющей грань многоугольника,
/// установленную методом ColorMaterial.
///
public const int COLOR_MATERIAL_FACE = 0x0B55;
///
/// Аргумент Get требует возврата значения 1 параметра - символьной постоянной,
/// определяющей тип цвета, установленный методом ColorMaterial.
///
public const int COLOR_MATERIAL_PARAMETER = 0x0B56;
Метод ColorMaterial должен быть активирован методом Enable с параметром
///
/// Параметр активации метода ColorMaterial.
/// Используется методами Get, Enable, IsEnabled и Disable.
///
public const int COLOR_MATERIAL = 0x0B57;
Определить состояние активности метода ColorMaterial можно методом Get или IsEnabled с тем же параметром.
Тест рубежного контроля
-
Опишите смысл параметров метода ColorMaterial.
-
Какой метод возвращает текущие значения параметров метода ColorMaterial?
-
Каковы значения параметров метода ColorMaterial по умолчанию?
-
Как активировать метод ColorMaterial?
-
Какие интенсивности интерпретируются в качестве цветов-параметров метода ColorMaterial?
Метод ShadeModel
Метод ShadeModel определяет режим затенения или обработку полутонов при изображении многоугольников в зависимости от двух значений его единственного параметра
///
/// Определяет режим изображения многоугольников.
/// При выключенных источниках света эффект не заметен.
///
///
/// Режим изображения. Допускает две символьные постоянные SMOOTH и FLAT.
/// По умолчанию SMOOTH.
///
[DllImport("OPENGL32.DLL", EntryPoint = "glShadeModel")]
public static extern void ShadeModel(int mode);
Константы, используемые методом ShadeModel, имеют вид
///
/// Параметр метода ShadeModel.
/// Изображает все цвета пикселей, окружающих вершину, цветом вершины.
///
public const int FLAT = 0x1D00;
///
/// Параметр метода ShadeModel.
/// Обеспечивает интерполяцию цветов вершин для плавного перехода от одной вершины к другой.
///
public const int SMOOTH = 0x1D01;
Текущее значение параметра метода ShadeModel определяется методом Get в форме
(int)gl.Get(gl.SHADE_MODEL, 1)[0]
Параметр SHADE_MODEL имеет значение
///
/// Аргумент Get требует возврата значения 1 параметра - символьной постоянной,
/// определяющей тип затенения, установленный методом ShadeModel.
///
public const int SHADE_MODEL = 0x0B54;
Примечание.
При выключенных источниках света эффект переключения параметров метода ShadeModel себя не проявляет. Изображение остается таким же, как при выборе значения SMOOTH.
Тест рубежного контроля
-
Для чего используется метод ShadeModel?
-
В чем смысл параметра метода ShadeModel.
-
Как определить текущее значение параметра метода ShadeModel?
Читатель, самостоятельно готовящий приложение, может использовать в нем приведенные методы LightModel, Material и ColorMaterial для наблюдения эффекта от включения освещения и изменений параметров этих методов на примере какого-либо объекта.
Авторское приложение позволяет наблюдать и регулировать параметры приведенных методов с помощью интерфейсных элементов управления. Комментарий к коду этой части авторского приложения можно найти по ссылке.
Достарыңызбен бөлісу: |