Detailed Texture/Splatting Texture
写在前面:
本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。
由于本人水平有限难免出现错误,还请评论区指出,多多指教。
部分图元和素材来源于网络,如有侵权请联系本人删除。
参考资料与链接会在文章末尾贴出。
=======================================================================
之前有介绍过我们可以用lerp混合两张纹理,考虑如果混合地形纹理会怎么样?
这里我混合了草地和石头的两种纹理,显然边缘太实太假。我们换一张渐变的权重纹理:
过渡变虚了比之前好一丢丢。现在我们试下去cover整个terrain:
假如这是一个简单的贴图感觉还好,但是假如贴在了4km x 4km之类的大地形上会感觉很不协调很重复,那我们调整tilling和offset试试
这样比例比较正常但远看仍然比较重复。
有同学会问,那我用大一点的纹理去cover比如4096x4096纹理去cover 4km x 4km地形,算下来1个像素的颜色cover一平方米的地形,也就是一种颜色代表一平方米的地形,仍然是不理想且占用很大的memory。
为了看上去不重复我们需要混合多种地形纹理,且最好每种地形有不同的tilling和offset,也就是我们开头所示范的lerp方法,但有个问题就是只能混合两种,太少了,有没有办法多一点呢?
我们知道一张纹理有RGBA四个通道,假如我们用一张RGBA纹理四个通道分别带别四种纹理的分布位置,不就可以混合四种不同地形纹理了吗?
R + G + B + A = 1
四个通道加起来应该不超过1,由于这张mask是手工画的实际上可能会有超过1,结果会比预想的要亮:
因此我们
那么实际上我们加多一个x(可正可负)
R + G + B + A + x = 1
x = 1-(R + G + B + A )则为负,加到最终结果可压暗回正常。其次,可以看成是第五个通道,也就是说可以有第五种地形纹理。
float4 DetailedTexture(sampler2D tex,float4 st,float2 uv) { uv = uv * st.xy + st.zw; float4 o = tex2D(tex,uv); return o; } float4 frag (v2f i) : SV_Target { float2 uv = i.uv; float4 t0 =DetailedTexture(_tex0,_tex0_ST,uv); float4 t1 =DetailedTexture(_tex1,_tex1_ST,uv); float4 t2 =DetailedTexture(_tex2,_tex2_ST,uv); float4 t3 =DetailedTexture(_tex3,_tex3_ST,uv); float4 t4 =DetailedTexture(_tex4,_tex4_ST,uv); float4 mask = tex2D(_texMask,uv); float parity = 1 - mask.r - mask.g - mask.b - mask.a; float4 finalCol = t0 * mask.r + t1 * mask.g + t2 * mask.b + t3 * mask.a; + t4 * parity; return finalCol; }
而且我们可以每一种纹理设置不同的tilling offset,这样重复度便会大大减小。
这种方法被叫做detailed texture或splatting texture。
当然这只是一个简单的texture technique,距离做出漂亮的地形还是有很长的距离的。
参考资料: