透明度如何实际实施?

时间:2011-11-15 12:01:56

标签: graphics

给定两张图像A,B我想要第三张图像C,好像B的透明度为t = 0.5并置于A的顶部。

C如何在现实中计算以及n如何影响它?我对任何程序或伪代码都不感兴趣我只想了解基本原理。

我认为C的一种方式只不过是A和B的交替像素。还有其他方法吗?

3 个答案:

答案 0 :(得分:4)

A和B的每个像素的颜色和可选的透明度根据重量组合。

如果透明度为0.75,那么通常会使用B中25%的颜色值和来自A(底层图像)的75%颜色值。

基本上,红色,绿色,蓝色和可选的alpha通道都是这样计算的,然后重新组合以形成一个结果像素。

示例:

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

如果图像本身具有Alpha通道,则计算变得更加复杂。

答案 1 :(得分:1)

我不确定“现实”中你是指那些破解这种效果的源代码,或者它是如何在自然界中起作用的。

代码

您可以通过两个输入图像的简单线性插值透明地叠加图像:

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;
}

然后,您可以拨打overlay_transparent (a,b, 0.5)进行50%的重叠。

实际上

透明材料反射一小部分入射光,一些部分被吸收, 另一部分通过材料传播。

一个完美的镜子镜面反射所有入射光,每个粒子输出矢量 完全取决于它的传入向量。

完美的漫反射材质反射所有入射光,但是对于每个传入的矢量 在命中点的半球内有无限多的可能的输出向量。

完美吸收的材料是黑色的,就像The Void本身一样。

一种完美传播的材料,在穿过材料的过程中不会扰乱颗粒 会隐形的。

到目前为止,所有这些完美的材料都不存在于大自然中,大多数现实世界的材料都是它们的混合物。

请注意,这本身就是一门科学;为了更深入的了解,您可以开始研究真实感图像 和路径追踪,以及BRDF / BSDF / ...的概念。

答案 2 :(得分:0)

对于每个像素,C(红色,绿色)中每个成分的值是A和B成分的平均值。

如果透明度不是50%,则使用加权平均值。

如果使用交替像素,结果将不会平滑。如果A全部是黑色而B是全部交替像素会产生条纹图案,而每个像素上的平均RGB值会产生均匀的50%灰色表面。