【0】-2 续上文
【1】什么是图形混合算法,如何增加图形算法。
CK2除了地形地图外的任何模式都是由一张颜色图和地形图叠加而成的。
以我这地图为例,两张图单独看分别是这样
![](http://imgsrc.baidu.com/forum/w%3D580/sign=51e6cba3c43d70cf4cfaaa05c8ddd1ba/08a19794a4c27d1efcc3a25e16d5ad6edfc438e5.jpg)
地形图
![](http://imgsrc.baidu.com/forum/w%3D580/sign=e9ff79958a94a4c20a23e7233ef51bac/089925fae6cd7b89a126a219022442a7d8330e04.jpg)
政治地图,由于MOD还没做完暂时都是一地伯爵。(这个是改了算法刷出来的100%基本色)
为了让两场图生成我们要的界面,CK2会调用一个可编辑的脚本。但我们还没讨论到那。类比的话这个脚本可以看作是一条生产线,通过一大段工序把两张图合在一起,而每个工序就是一个函数。
CK2 原版的最终输出脚本是这样的(节选)
sample.rgb = GetOverlay( sample.rgb,TerrainColor,0.5f);
float2 vBlend = float2(0.4f,0.45f);
vOut = ( dot(sample.rgb, GREYIFY) *vBlend.x + terrain_color.rgb * vBlend.y );
如果你看不懂这一坨,没关系。只要注意到第一行有一个GetOverlay(xx,xx,xx) 这就是一个基本算法—叠加(用过PS的都知道)。
由于P社是著名的蠢驴,sample.rgb实际上是地形,TerrainColor,反而是颜色图
GetOverlay( sample.rgb, TerrainColor,0.5f)就是在sample上以50%的透明度叠加TerrainColor
如果只是简单的(100%,不做其他处理)叠加,效果是这样。具体算法这里不展开讨论
![](http://imgsrc.baidu.com/forum/w%3D580/sign=fcbf7893bb003af34dbadc68052bc619/7ddabd345982b2b71acea15e3cadcbef77099b72.jpg)
另一个常用的算法是简单的Blend,效果相当于在一个图像上直接半透明地覆盖上另一张图。可以看到在上述脚本最后一行也出现了 简单的Blend效果如下图(相当于PS图层不透明度)
![](http://imgsrc.baidu.com/forum/w%3D580/sign=2fc330fb02b30f24359aec0bf894d192/2ba8bfc379310a55e753456eba4543a983261057.jpg)
在利用这些“工序”编出一个生产流程前,如果你觉得“这不够,我还想其他高级的选择”,比如PS里的“滤色”,“柔光”等,那就要手动定义新的函数了。
这些函数的定义在standardfuncsgfx.FXH里
我们可以找到这些行:
float3 GetOverlay( float3 vColor, float3vOverlay, float vOverlayPercent )
{
float3res;
res.r= vOverlay.r < .5 ? (2 * vOverlay.r * vColor.r) : (1 - 2 * (1 - vOverlay.r) *(1 - vColor.r));
res.g= vOverlay.g < .5 ? (2 * vOverlay.g * vColor.g) : (1 - 2 * (1 - vOverlay.g)* (1 - vColor.g));
res.b= vOverlay.b < .5 ? (2 * vOverlay.b * vColor.b) : (1 - 2 * (1 - vOverlay.b)* (1 - vColor.b));
returnlerp( vColor, res, vOverlayPercent );
}
这是关于叠加的定义, 简化来说就是
两张图A,B叠加,结果为C,对于某一像素
B<=0.5: C=2*A*B
B>0.5: C=1-2*(1-A)*(1-B)
为了给后续工作做准备,这里lz把PS常用的滤色和柔光算法加上
百度得算法为
滤色
C=1-(1-A)*(1-B)
柔光
A<=0.5:C=(2*A-1)*(B-B*B)+B
A>0.5: C=(2*A-1)*(sqrt(B)-B)+B
按照上面格式照抄,就有了
float3 GetsFilter( float3 vColorA, float3vColorB, float vOverlayPercent )
{
float3res;//定义一个由三个浮点数组成的变量res
res.r= 1-(1-vColorA.r)*(1-vColorB.r);
res.g= 1-(1-vColorA.g)*(1-vColorB.g);
res.b= 1-(1-vColorA.b)*(1-vColorB.b);
//根据滤色算法对RGB通道分别处理图像,并给res赋值,这样res就是处理过后的图像
returnlerp( vColorA, res, vOverlayPercent );//lerp是图像的简单混合,这里是把res按照vOverlayPercent的透明的覆盖到原图上,用来控制滤色混合的强度
}
对于柔光:
float3 GetsSoftlight( float3 vColorA,float3 vColorB, float vOverlayPercent )
{
float3res;
res.r=vColorA.r < .5 ?( (2*vColorA.r-1)*(vColorB.r-vColorB.r*vColorB.r)+vColorB.r):((2*vColorA.r-1)*(sqrt(vColorB.r)-vColorB.r)+vColorB.r);
res.g=vColorA.g < .5 ?((2*vColorA.g-1)*(vColorB.g-vColorB.g*vColorB.g)+vColorB.g):((2*vColorA.g-1)*(sqrt(vColorB.g)-vColorB.g)+vColorB.g);
res.b=vColorA.b < .5 ?( (2*vColorA.b-1)*(vColorB.b-vColorB.b*vColorB.b)+vColorB.b):((2*vColorA.b-1)*(sqrt(vColorB.b)-vColorB.b)+vColorB.b);
returnlerp( vColorA, res, vOverlayPercent );
}
这时候我们就可以在脚本里和自带的Overlay一样调用了,如
vOut =GetsFilter(sample.rgb,terrain_color.rgb,1.0f);//100%滤色
![](http://imgsrc.baidu.com/forum/w%3D580/sign=732af428bfb7d0a27bc90495fbee760d/887926d12f2eb938454ee268d8628535e4dd6fac.jpg)
或者vOut = GetsSoftlight(sample.rgb,terrain_color.rgb,1.0f);//100%柔光
可以说顾名思义就是柔和版的Overlay。
![](http://imgsrc.baidu.com/forum/w%3D580/sign=667a3db9bd7eca80120539efa1229712/f243b3cc7cd98d10d58297ab2c3fb80e7aec9071.jpg)
和Overlay(下图对比)
![](http://imgsrc.baidu.com/forum/w%3D580/sign=fab998d0d7b44aed594ebeec831d876a/b2980d950a7b02080755a47b6fd9f2d3562cc82f.jpg)
想要其他叠加效果的可以依此类推,算法网上可以找到。
---------------------------------------------【1】完