假设你有两个图像A和B,第三个灰度图像T.A和B包含几乎任何东西,但假设它们是一个游戏的两个场景。
现在,假设T包含一个钻石梯度。由于灰阶,它从外面的黑色变成了内部的白色。
随着时间的推移,让我们假设256没有进一步阐述的“蜱”匹配灰度,A应该过渡到B给钻石擦拭效果。如果T包含一个由较小的矩形梯度组成的网格,它就像图像的每个部分都做了一个矩形擦拭。
如果您曾经与RPG制造商或大多数视觉新颖的引擎合作过,您可能会认识到这个概念。
当然,问题是如何做到这一点。我知道这涉及到A和B之间的每像素混合,但这就是我所得到的。
为了额外的奖励,软边呢?
和现在,结论
来自最终实验的样本--波浪上升,50% http://helmet.kafuka.org/TransitionsSample.png
发布于 2009-11-08 11:09:20
T图像中的灰度值表示时间偏移。在每像素的基础上,您的擦除效果基本如下:
for (timeIndex from 0 to 255)
{
for (each pixel)
{
if (timeIndex < T.valueOf[pixel])
{
compositeImage.colorOf[pixel] = A.colorOf[pixel];
}
else
{
compositeImage.colorOf[pixel] = B.colorOf[pixel];
}
}
}
为了说明,想象一下在timeIndex
的几个值上发生了什么
timeIndex == 0
(0%):这是过渡的开始。此时,合成图像中的大部分像素将是图像A的像素,除非T中的相应像素是完全黑色的。在这种情况下,合成图像像素将是图像B的像素。timeIndex == 63
(25%):此时,更多来自图像B的像素已将其输入复合图像。每个T值小于25%的像素都将从图像B中提取,其余仍为图像A。timeIndex == 255
(100%):此时,T中的每个像素都将否定条件,因此复合图像中的所有像素都是图像B的像素。为了“平滑”过渡,您可以执行以下操作:
for (timeIndex from 0 to (255 + fadeTime))
{
for (each pixel)
{
blendingRatio = edgeFunction(timeIndex, T.valueOf[pixel], fadeTime);
compositeImage.colorOf[pixel] =
(1.0 - blendingRatio) * A.colorOf[pixel] +
blendingRatio * B.colorOf[pixel];
}
}
edgeFunction
的选择取决于你。这一次产生了从A到B的线性过渡:
float edgeFunction(value, threshold, duration)
{
if (value < threshold) { return 0.0; }
if (value >= (threshold + duration)) { return 1.0; }
// simple linear transition:
return (value - threshold)/duration;
}
发布于 2009-11-08 11:08:25
我会说,你从图像A开始,然后在每一步中,你对T小于我的每个位置使用图像A的像素,否则就用图像B的像素。
对于软边缘,可以定义另一个参数d,并计算像素P,如下所示:
对于每一点(x,y),您可以选择以下三个选项:
这会产生一个线性边,当然,您可以在任意数量的函数之间进行选择。
https://stackoverflow.com/questions/1697356
复制