- PVSM.RU - https://www.pvsm.ru -

Зависимость прозрачности от ориентации поверхности

На днях, вертя в руках пластиковый стаканчик, я обратил внимание на то, что видимая прозрачность пластика за висит от угла, под которым смотришь на поверхность — если смотреть перпендикулярно поверхности, то задний фон отчетливо виден, а если смотреть вдоль поверхности, то материал становится практически непрозрачным. Это явление меня заинтересовало, и я решил построить математическую модель.

Сказано — сделано. Под катом вывод формулы, код фрагментного шейдера и небольшое демо.

Будем считать что материал оптический однородный — его оптические свойства не зависят от направления. Тогда изменение прозрачности обуславливается разной длиной пути светового луча в толще материала.

Зависимость прозрачности от ориентации поверхности

Зависимость прозрачности от ориентации поверхности, где Зависимость прозрачности от ориентации поверхности — единичный вектор нормали к поверхности, Зависимость прозрачности от ориентации поверхности — единичный вектор направления на наблюдателя.

Пусть видимая прозрачность материала определяется коэффициентом непрозрачности, который определяет смешивание цвета материала с цветом фона следующим образом: Зависимость прозрачности от ориентации поверхности

Давайте посмотрим, как значение Зависимость прозрачности от ориентации поверхности зависит от толщины материала. Для этого разобьем слой материла c толщиной Зависимость прозрачности от ориентации поверхности и коэффициентом непрозрачности Зависимость прозрачности от ориентации поверхности на Зависимость прозрачности от ориентации поверхности слоев одинаковой толщины Зависимость прозрачности от ориентации поверхности, каждый с коэффициентом непрозрачности Зависимость прозрачности от ориентации поверхности. Пусть Зависимость прозрачности от ориентации поверхности — цвет фона, Зависимость прозрачности от ориентации поверхности — цвет материала, а Зависимость прозрачности от ориентации поверхности — цвет на выходе каждого слоя.

Зависимость прозрачности от ориентации поверхности

Но также Зависимость прозрачности от ориентации поверхности, а следовательно:
Зависимость прозрачности от ориентации поверхности

Т.е. с увеличением толщины видимая прозрачность материала убывает экспоненциально.

Пусть толщина Зависимость прозрачности от ориентации поверхности, тогда:
Зависимость прозрачности от ориентации поверхности

Итак, искомая формула: Зависимость прозрачности от ориентации поверхности

Зависимость прозрачности от ориентации поверхности

Ниже приведен код фрагментного шейдера, который реализует эту формулу:

varying vec4 v_color;
varying vec3 v_normal;
varying vec3 v_eye;

void main(void)
{
    // Вектора нормали и направления на наблюдателя не нормализированы
    float cosPhi = dot(v_normal, v_eye) / sqrt( dot(v_normal, v_normal) * dot(v_eye, v_eye) );
    // Косинус берется по модулю, на случай если наблюдатель находится сзади поверхности
    // Чтобы избежать деления на нуль, значение косинуса принудительно ограничено снизу
    // 0.999 ^ 10000 = 4.5173346E-5
    float alpha = 1.0 - pow(1.0 - v_color.a, 1.0 / max(abs(cosPhi), 0.00001));
    gl_FragColor = vec4(vec3(v_color), alpha);
};

В результате получается вот что:

Исходный код демонстрационного приложения доступен на bitbucket.org [1]

Автор: kjam

Источник [2]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/opengl/22293

Ссылки в тексте:

[1] bitbucket.org: https://bitbucket.org/nickolas_pohilets/alpha_demo

[2] Источник: http://habrahabr.ru/post/161961/