Unity3D - 混合贴图的地形Shader

贴图上每个像素都由四个通道构成,包括三个原色R、G、B 和一个alpha值A。因此,每个像素点都可以携带四个值。

利用贴图的这种结构,我们将分别存放R、G、B、A四个通道值的灰图合成一张新贴图,如图所示:

灰图上的颜色值介于[0,1]之间,越亮的部分颜色越接近白色,色值也越接近1。越暗的部分,颜色越接近黑色,色值接近于0。
第一张灰图的左上角存放的是R通道(red)值,且颜色值是白色,色值接近1,在组合后形成的示意图中呈红色。其他三块区域类同。
(PS.这里讲到的四张图合成一张图,并非实际将四张图混合在一起,而是示意灰图的合成变化。)



地表贴图

大多数地表都是由不同层级的贴图复合而成,如草地、泥土、小石子、石头贴图。我们将这几种不同贴图分布规律的灰图合成一张地表贴图。如下图:

计算最终颜色代码:

float4 finalColor;
finalColor = lerp(rTexData, gTexData, blendData.g);
finalColor = lerp(finalColor, bTexData, blendData.b);
finalColor = lerp(finalColor, aTexData, blendData.a);
finalColor.a = 1.0;

float4 terrainLayers = lerp(_ColorA, _ColorB, blendData.r);
finalColor *= terrainLayers;
finalColor = saturate(finalColor);

下图演示了利用插值取得地表颜色的过程:

上面的代码中,首先以R贴图为基础绘制G贴图在R贴图上的分布,利用地形贴图中G通道上的G贴图分布值。(有点拗口) 在计算出的最终颜色之后,又依次与B、A贴图进行插值计算。
其中地形贴图中的R通道值并非记录R贴图的颜色分布,而是记录了地表基色_ColorA_ColorB的值。同样R的值越接近1,颜色就越接近_ColorB。(PS.这段话是我自己的理解。)

实例地址:
https://github.com/rungameme/terrain_blending_textures

Comments