给定两张图像A,B我想要第三张图像C,好像B的透明度为t = 0.5并置于A的顶部。
C如何在现实中计算以及n如何影响它?我对任何程序或伪代码都不感兴趣我只想了解基本原理。
我认为C的一种方式只不过是A和B的交替像素。还有其他方法吗?
答案 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%灰色表面。