index.x - dot(normalize(reflectDir). Xunitvec) * 0.5;

// Привести значения index к правильному диапазону

if (reflectDir.z >= 0.0)
index = (index +1.0) * 0.5: else {
index.t - (index.t + 1.0) * 0.5: index.s - (-index.s) * 0.5 + 1.0:
}

// если reflectDir.z > 0.0. s будет находиться в диапазоне от 0.25 // до 0.75

// если reflectDir.z < 0.0. s будет находиться в диапазоне от 0.75 до 1.25. //и это нормально, так как установки текстуры позволяют это

// Выполнить поиск в карте среды.

vec3 envColor = vec3 (teXture2D(EnvMap. index)):

// Добавить освещение в базовый цвет и сиешать

vec3 base - Lightlntensity * BaseColor: envColor - mix(envColor. base. MixRatio);
gl^FragColor - vec4 (envColor. 1.0):
}

Varying-перемекиые Normal и EyeDi r - это значения, вычисленные вершинным тендером и затем интерполированные в пределах примитива. Чтобы получить действительно точные результаты, нужно опять нормализовать значения во фрагментом шейдере. Исключение нормализации немного улучшит производительность, но ухудшит качество; для некоторых объектов это приемлемо.

Константы Xunitvec и Yunitvec установлены в значения, необходимые для вычисления углов возвышения и азимута. Сначала нужно вычислить угол возвышения путем нормализации вектора reflectionDir и выполнения операции dot над Yunitvec. Так как оба вектора являются единичными, это дает значение косинуса для нужного угла, значение которого колеблется в пределах [-1,1]. Установка компонента у вектора отражения в 0 приведет к отображению этого вектора на плоскость XZ. Нормализация нового вектора дает косинус угла азимута, значение которого колеблется в пределах [-1,1]. Так как горизонтальное направление текстуры среды охватывает все 360°, умножаем это значение на 0,5, так что результат будет находиться в пределах половины карты среды. Теперь нужно определить, что же это за половина.

Если компонент г направления отражения является положительным, направление отражения - от передней стороны, и вычисленное значение будет использоваться непосредственно. Значения масштабируются и смещаются, так что при доступе к текстуре значения s будут находиться в диапазоне [0,25, 0,75], а значения t - в диапазоне [0, 1 ].


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