Листинг 9.4. Масштабирование нормали

normal = normal * gl_NormalScale;

Коэффициенты масштабирования сохраняются как состояние OpenGL, и к ним можно обращаться из шейдера, используя встроенную uniform-переменную gl _Norma 1 Seal е.

Координаты текстур также можно преобразовывать. Для каждого текстурного модуля в OpenGL определена текстурная матрица и к ней можно обращаться че9.2. Источники освещения рез встроенную uniform-переменную массива матриц gl_TextureMatrix. Входные координаты текстур преобразуются точно так же, как координаты вершин (листинг 9.5).

Листинг 9.5. Преобразование текстурных координат

gl_JexCoord[0] = gl_TextureMatrix[0] * gl_Mu1 tiTexCoordO:

9,2. Источники освещения В OpenGL необходимо вычислять освещение. Начнем с определения функции для каждого типа источников освещения: направленного света, точечных и прожекторов. Для этого существуют переменные, в которых будут содержаться доли рассеянного, отраженного и зеркального света от всех источников освещения. Эти переменные должны быть инициализированы в 0 перед вычислением освещения.

9.2.1. Источники направленного света Направленный свет - это свет, источник которого находится бесконечно далеко от освещаемых объектов. С таким допущением все лучи света от источника параллельны, и для каждой точки можно использовать один и тот же вектор направления освещения. Это упрощает математические вычисления, поэтому код для работы с направленным освещением проще, чем код для работы с другими видами освещения, и быстрее работает. Так как источник света бесконечно далек, направление максимального освещения одинаково для каждой точки. Этот вектор можно вычислить для каждого источника света i заранее и сохранить в переменной gl_Li ghtSourcefi ] .hal fVector. Этот тип источника освещения используется для имитации солнечного света.

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


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