Как на самом деле реализуется прозрачность? - PullRequest
2 голосов
/ 15 ноября 2011

С учетом двух изображений A, BI требуется третье изображение C, которое выглядит так, как будто B имеет прозрачность t = 0,5 и помещается поверх A.

Как рассчитывается C в реальности и как n влияет на него?Я не заинтересован в какой-либо программе или псевдокоде, я просто хочу знать основную причину.

Один из способов, по-моему, это то, что С представляет собой чередующиеся пиксели А и В. Каковы другие способы?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2011

Цвет и, возможно, прозрачность каждого пикселя A и B комбинируются в соответствии с весом.

Если прозрачность составляет 0,75, то обычно используются 25% значений цвета из B и 75% значений цвета из A (базовое изображение).

По сути, каждый из красных, зеленых, синих и, возможно, альфа-каналов рассчитывается следующим образом, а затем рекомбинируется для формирования одного результирующего пикселя.

Пример:

A = [1 0 0]  <-- red
B = [0 1 0]  <-- blue
a = 0.75 (which means B is more transparent than it is opaque)

C = [
    0.75 = 1 * 0.75 + 0 * 0.25 (red component)
    0.25 = 0 * 0.75 + 1 * 0.25 (green component)
    0.00 = 0 * 0.75 + 0 * 0.25 (blue component)
] //       A          B

Если изображения имеют альфа-каналы сами по себе, вычисление становится более сложным.

1 голос
/ 15 ноября 2011

Я не уверен, что под "реальностью" вы подразумеваете исходный код, который взламывает такой эффект, или как он работает в природе.

В коде

Вы можете прозрачно наложить изображения простымЛинейная интерполяция обоих входных изображений:

Color lerp (Color lhs, Color rhs, real f) {
    return (1-f)*lhs + f*rhs;
}

Image overlay_transparent (Image a, Image b, real f) {
    assert (a.width == b.width);
    assert (a.height == b.height);

    Image output;
    for_each (y : 0 .. a.height)
        for_each (x : 0 .. a.width)
            output(x,y) = lerp(a(x,y), b(x,y), f);
    return output;
}

Затем можно выполнить наложение 50%, вызвав overlay_transparent (a,b, 0.5).

В действительности

Прозрачные материалы отражают долювходящий свет, некоторая часть поглощается, а другая часть пропускается через материал.

Идеальное зеркало отражает весь входящий свет зеркально, каждый выходящий вектор частиц зависит исключительно от его входящего вектора.

Совершенно рассеянный материал отражает весь входящий свет, но для каждого входящего вектора в полушарии существует бесконечно много возможных векторов выделения в точке попадания.

Идеально поглощающий материал черный, как и сама Пустота..

Прекрасно пропускающий материал, который не мешает частицам на путитьфу материал будет невидим.

Все эти совершенные материалы пока не встречаются в природе, и большинство материалов реального мира представляют собой их смесь.

Обратите внимание, что это наука всам;для получения более глубоких знаний вы можете начать изучение синтеза реалистичных изображений и трассировки путей, а также концепции BRDF / BSDF / ....

0 голосов
/ 15 ноября 2011

Для каждого пикселя значение каждого компонента в C (красный, зеленый, синий) является средним значением для компонентов A и B.

Если прозрачность не 50%, используется средневзвешенное значение.

Если вы используете чередующиеся пиксели, результат не будет гладким. Если A - все черное, а B - все, то чередующиеся пиксели дают полосатый рисунок, в то время как средние значения RGB для каждого пикселя дают ровную 50% серую поверхность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...