图像变形主要是图形设计SFX,使用艺术家决定的一些点来使一张图片适应另一张图片,艺术家必须将一张肖像上的一些关键区域与另一幅画面匹配,然后某些算法适应整个图片从一个变为另一个。
我想用着色器做一些类似的事情,它可以加载任何2个图形,并自动选择图片相同区域中最相似颜色的区域,并自动变换两张图片进行实时处理。也许基于着色器的版本在任务上逻辑上会更快?除了我甚至不理解它是如何工作的。
如果您知道,请不要担心有关此过程的完整回复,如果您保存模糊的背景概念和关键字,以及如何在图形着色器中尝试二维纹理变形,那将会很棒。< / p>
答案 0 :(得分:0)
有更多的变形方法,你所描述的是基于几何的。
通过插值变形
您有2个具有相似属性的数据集(例如,2个图像都是2D),并通过某些参数在它们之间进行插值。对于2D图像,如果两个图像的分辨率相同,则可以使用线性插值;如果不是,则可以使用三线性插值。
因此,您只需从每个图像中选择相应的像素,并为某些参数t=<0,1>
插入实际颜色。对于相同的分辨率,像这样:
for (y=0;y<img1.height;y++)
for (x=0;x<img1.width;x++)
img.pixel[x][y]=(1.0-t)*img1.pixel[x][y] + t*img2.pixel[x][y];
其中img1,img2
是输入图像,img
是输出图像。请注意t
是浮动的,因此您需要改写以避免整数舍入问题或使用比例t=<0,256>
并通过右移8位或/256
来更正结果对于您需要的不同大小双线性地首先在两个源图像中插入相应的(x,y)
位置。
所有这一切都可以在片段着色器中轻松完成。只需将img1,img2
绑定到纹理单元0,1
,然后从中插入纹素并插入最终颜色。双线性坐标插值由GLSL自动完成,因为无论分辨率如何,纹理坐标都归一化为<0,1>
。在Vertex中,您只需传递纹理和顶点坐标。在主程序方面,您只需绘制单个Quad,覆盖最终图像输出......
按几何变形
你有2个多边形(或匹配点),并在2之间插入它们的位置。例如:Morph a cube to coil。这适用于矢量图形。你只需要有点相应性,然后插值类似于#1 。
for (i=0;i<points;i++)
{
p(i).x=(1.0-t)*p1.x + t*p2.x
p(i).y=(1.0-t)*p1.y + t*p2.y
}
其中p1(i),p2(i)
距离每个输入几何图形集i-th
点,p(i)
指向最终结果...
为了增强视觉外观,线性插值与特定轨迹(如BEZIER曲线)交换,因此变形看起来更酷。例如,见
要完成此操作,您需要使用几何着色器(或者甚至是tesselation着色器)。您需要将两个多边形作为单个图元传递,然后几何着色器应插入实际多边形并将其传递给顶点着色器。
通过粒子群变形
在这种情况下,您可以通过匹配颜色在源图像中找到相应的像素。然后将每个像素作为粒子处理,并使用参数img1
从img2
中的位置到t
创建其路径。它与#2 相同,但相反,多边形区域只有点数。粒子有color,position
你插入两个...因为很有可能你会得到精确的颜色匹配和计数......(直方图是相同的),这是不可能的。
混合变形
#1,#2,#3
我确信有更多的变形方法,这些只是我所知道的。变形不仅可以在空间域中完成......