日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

#游戏unity-VR场景漫游#shader之消除纹理重复感

發(fā)布時(shí)間:2024/8/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 #游戏unity-VR场景漫游#shader之消除纹理重复感 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)游戲中地面的紋理都是重復(fù)的時(shí)候,會(huì)看起來(lái)很假,而且影響沉浸感。
很明顯地可以看出來(lái)有固定的pattern。這主要是因?yàn)槊總€(gè)0~1的tile內(nèi)的紋理都是完全一樣的,iq提出了兩種方法來(lái)改良,使得看起來(lái)不會(huì)這么有重復(fù)感。當(dāng)然,這兩種技術(shù)都會(huì)成倍增大采樣的次數(shù),同時(shí)也有一些額外的計(jì)算,但效果還是不錯(cuò)的,在能夠承受這種cost的時(shí)候還是很值得一用的。


對(duì)每個(gè)tile使用的紋理進(jìn)行隨機(jī)的翻轉(zhuǎn)和平移

  • 消除每個(gè)tile的重復(fù)感。這是通過(guò)判斷當(dāng)前所處的tile(這可以利用floor(uv)輕松得到),然后給每個(gè)tile一個(gè)四維的偽隨機(jī)數(shù),xy表示該tile的翻轉(zhuǎn)方向(即水平和豎直方向上是否要進(jìn)行mirror),zw表示該tile的平移方向,至此就可以保證每個(gè)tile都是不同的了。

    上一步的結(jié)果有兩個(gè)問(wèn)題,首先是在tile和tile相交處有明顯的接縫問(wèn)題。這個(gè)可以通過(guò)算該tile旁邊的三個(gè)tiles的采樣結(jié)果,然后靠uv的小數(shù)部分判斷距離接縫處的距離,并據(jù)此來(lái)混合四個(gè)采樣結(jié)果,模糊接縫處使得結(jié)果看起來(lái)比較自然。何時(shí)開(kāi)始混合邊界可以當(dāng)成一個(gè)參數(shù)來(lái)調(diào)節(jié)。
    即便模糊了接縫處,還是會(huì)有一些殘留的接縫。這些接縫產(chǎn)生的原因是因?yàn)槲覀冞@種方法會(huì)使得uv在tile的邊界處產(chǎn)生很大的跳躍,導(dǎo)致mipmaping的時(shí)候也會(huì)出現(xiàn)跳躍。解決方法就是傳遞正確的ddx和ddy給tex2D函數(shù),避免uv跳躍即可。
fixed4 texNoTileTech1(sampler2D tex, float2 uv) {float2 iuv = floor(uv);float2 fuv = frac(uv);// Generate per-tile transformation#if defined (USE_HASH)float4 ofa = hash4(iuv + float2(0, 0));float4 ofb = hash4(iuv + float2(1, 0));float4 ofc = hash4(iuv + float2(0, 1));float4 ofd = hash4(iuv + float2(1, 1));#elsefloat4 ofa = tex2D(_NoiseTex, (iuv + float2(0.5, 0.5))/256.0);float4 ofb = tex2D(_NoiseTex, (iuv + float2(1.5, 0.5))/256.0);float4 ofc = tex2D(_NoiseTex, (iuv + float2(0.5, 1.5))/256.0);float4 ofd = tex2D(_NoiseTex, (iuv + float2(1.5, 1.5))/256.0);#endif// Compute the correct derivativesfloat2 dx = ddx(uv);float2 dy = ddy(uv);// Mirror per-tile uvsofa.zw = sign(ofa.zw - 0.5);ofb.zw = sign(ofb.zw - 0.5);ofc.zw = sign(ofc.zw - 0.5);ofd.zw = sign(ofd.zw - 0.5);float2 uva = uv * ofa.zw + ofa.xy, dxa = dx * ofa.zw, dya = dy * ofa.zw;float2 uvb = uv * ofb.zw + ofb.xy, dxb = dx * ofb.zw, dyb = dy * ofb.zw;float2 uvc = uv * ofc.zw + ofc.xy, dxc = dx * ofc.zw, dyc = dy * ofc.zw;float2 uvd = uv * ofd.zw + ofd.xy, dxd = dx * ofd.zw, dyd = dy * ofd.zw;// Fetch and blendfloat2 b = smoothstep(_BlendRatio, 1.0 - _BlendRatio, fuv);return lerp( lerp(tex2D(tex, uva, dxa, dya), tex2D(tex, uvb, dxb, dyb), b.x),lerp(tex2D(tex, uvc, dxc, dyc), tex2D(tex, uvd, dxd, dyd), b.x), b.y); }

Voronoi分布來(lái)劃分和混合空間

這種劃分的好處是混合是發(fā)生在Voronoi圖上的,而不是整整齊齊的方格上,看起來(lái)可能更加自然。

  • 空間劃分。整個(gè)空間還是會(huì)有若干的tile,但是會(huì)在每個(gè)tile內(nèi)隨機(jī)生成一個(gè)Voronoi點(diǎn),每個(gè)點(diǎn)對(duì)應(yīng)了一個(gè)紋理樣式(靠隨機(jī)平移來(lái)區(qū)分)。
  • 混合。計(jì)算每個(gè)像素所在的周圍9個(gè)Voronoi點(diǎn),采樣得到它們的紋理顏色,混合的時(shí)候依靠該像素到每個(gè)Voronoi點(diǎn)的距離的高斯衰減值作為混合權(quán)重,也就是說(shuō),距離Voronoi點(diǎn)越近權(quán)重越高。與方法一不同,這種方法其實(shí)隨時(shí)隨地都在混合(方法一的混合只發(fā)生在邊界處),因此采用高斯衰減的好處就在于越靠近高斯衰減權(quán)重會(huì)迅速升高,使得混合不會(huì)造成整體非常模糊。最后,還需要對(duì)總體混合權(quán)重進(jìn)行一次歸一化,防止顏色失真。

    shader代碼——
fixed4 texNoTileTech2(sampler2D tex, float2 uv) {float2 iuv = floor(uv);float2 fuv = frac(uv);// Compute the correct derivatives for mipmappingfloat2 dx = ddx(uv);float2 dy = ddy(uv);// Voronoi contributionfloat4 va = 0.0;float wt = 0.0;float blur = -(_BlendRatio + 0.5) * 30.0;for (int j = -1; j <= 1; j++) {for (int i = -1; i <= 1; i++) {float2 g = float2((float)i, (float)j);#if defined (USE_HASH)float4 o = hash4(iuv + g);#elsefloat4 o = tex2D(_NoiseTex, (iuv + g + float2(0.5, 0.5))/256.0);#endif// Compute the blending weight proportional to a gaussian falloffloat2 r = g - fuv + o.xy;float d = dot(r, r);float w = exp(blur * d);float4 c = tex2D(tex, uv + o.zw, dx, dy);va += w * c;wt += w;}}// Normalizationreturn va/wt; }

總結(jié)

以上是生活随笔為你收集整理的#游戏unity-VR场景漫游#shader之消除纹理重复感的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。