当游戏中地面的纹理都是重复的时候,会看起来很假,而且影响沉浸感。
很明显地可以看出来有固定的pattern。这主要是因为每个0~1的tile内的纹理都是完全一样的,iq提出了两种方法来改良,使得看起来不会这么有重复感。当然,这两种技术都会成倍增大采样的次数,同时也有一些额外的计算,但效果还是不错的,在能够承受这种cost的时候还是很值得一用的。


对每个tile使用的纹理进行随机的翻转和平移

  • 消除每个tile的重复感。这是通过判断当前所处的tile(这可以利用floor(uv)轻松得到),然后给每个tile一个四维的伪随机数,xy表示该tile的翻转方向(即水平和竖直方向上是否要进行mirror),zw表示该tile的平移方向,至此就可以保证每个tile都是不同的了。

    上一步的结果有两个问题,首先是在tile和tile相交处有明显的接缝问题。这个可以通过算该tile旁边的三个tiles的采样结果,然后靠uv的小数部分判断距离接缝处的距离,并据此来混合四个采样结果,模糊接缝处使得结果看起来比较自然。何时开始混合边界可以当成一个参数来调节。
    即便模糊了接缝处,还是会有一些残留的接缝。这些接缝产生的原因是因为我们这种方法会使得uv在tile的边界处产生很大的跳跃,导致mipmaping的时候也会出现跳跃。解决方法就是传递正确的ddx和ddy给tex2D函数,避免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分布来划分和混合空间

这种划分的好处是混合是发生在Voronoi图上的,而不是整整齐齐的方格上,看起来可能更加自然。

  • 空间划分。整个空间还是会有若干的tile,但是会在每个tile内随机生成一个Voronoi点,每个点对应了一个纹理样式(靠随机平移来区分)。
  • 混合。计算每个像素所在的周围9个Voronoi点,采样得到它们的纹理颜色,混合的时候依靠该像素到每个Voronoi点的距离的高斯衰减值作为混合权重,也就是说,距离Voronoi点越近权重越高。与方法一不同,这种方法其实随时随地都在混合(方法一的混合只发生在边界处),因此采用高斯衰减的好处就在于越靠近高斯衰减权重会迅速升高,使得混合不会造成整体非常模糊。最后,还需要对总体混合权重进行一次归一化,防止颜色失真。

    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;
}

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

  1. Unity VR全景漫游

    最近对三维虚拟漫游感兴趣,偶遇这篇博文,转载过来相互学习. 文章来源:Unity VR全景漫游,深表感谢! Unity VR全景漫游 前言 最近VR如火如茶,就学习就落伍啦,所以有空闲时间研究下相关知 ...

  2. Unity VR场景内资源闪面

    在使用VR的时候,用头盔看场景会出现闪面的问题,闪面原因之一是Camera的Clipping Planes的值过于小的引起的,而我们将Clipping Planes的值调高后,手柄又会看不见,所以我们 ...

  3. 小程序使用three.js开发VR场景漫游

    下载所需要文件,参考:GitHub - yannliao/threejs-example-for-miniprogram: 这是一个 three.js 在微信小程序里的使用示例 引入js文件 impo ...

  4. #游戏unity-VR场景漫游#关于VR以及项目基础

    #游戏unity-VR场景漫游#关于VR以及项目基础 近年来,随着互联网的发展,VR的发展及其迅速,结合unity平台,可以制造很多不同的VR项目. 目前市场上大概有三种类型的VR硬件设备: 第1种: ...

  5. #游戏unity-VR场景漫游#有关VR环境的搭建【HTC vive】

    #游戏unity-VR场景漫游#有关VR环境的搭建[HTC vive] 需要解释的一点是,上一周赶上清明假期,我们团队确认了分工和计划后,就各自开始行动了,以至于忘记了更博客,差的两篇博客都会在这一周 ...

  6. unity的vr场景怎么做_如何运用Unity制作VR全景漫游?

    看文百篇,不如实操一遍.今天给大家分享的是通过Unity制作VR全景漫游的过程与方法,大家感兴趣可以动手试试. 前言 本文介绍了两种方法来制作VR场景:方法一:通过6张小图搭建的VR场景 方法二:通过 ...

  7. unity的vr场景怎么做_怎么运用Unity制作VR全景漫游

    展开全部 前言 本文介绍了两种方法来制作VR场景: 方法一62616964757a686964616fe58685e5aeb931333363393038:通过6张小图搭建的VR场景 方法二:通过一张 ...

  8. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  9. #基于VR环境下的手指识别键盘输入# VR场景搭建和移动漫游(一)

    基本结束了输入阶段的调试之后,开始搭建VR场景.VR的基本配置在前文当中已经提到过了,导入SteamVR和VRTK的文件包之后,将可用的场景素材放入Unity文件中.先将[Camera Rig]/[s ...

  10. 《UnityAPI.NavMeshAgent导航网格代理》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Unity+NavMeshAgent+立钻哥哥++OK++)

    <UnityAPI.NavMeshAgent导航网格代理> 版本 作者 参与者 完成日期 备注 UnityAPI_NavMeshAgent_V01_1.0 严立钻 2020.09.10 # ...

最新文章

  1. Python2和Python3共存下使用robotframework
  2. MyBatis中传递数组参数和List参数时if-test判空和判断长度的写法
  3. ChainMapper和ChainReducer
  4. SAP CRM Business Partner API的buffer工作原理
  5. phpcmsV9 自定义分页函数与调用 - 不影响后台SQL分页
  6. (原)python爬虫入门(2)---排序爬取的辽宁科技大学热点新闻
  7. #9 shell脚本的函数运用
  8. 网络虚拟化基础协议之Geneve
  9. silktest 破解 转帖未验证
  10. html中评论的星星怎么写,css 评分效果的星星示例
  11. 安全测试 switchport protected
  12. 利用学信网免费激活PyCharm企业版(也适用所有其它JetBrains的IDE)
  13. 【opencv14】cv::Mat---Desne数组类
  14. UVM:filed_automation
  15. 163vip邮箱账号登录入口在哪儿?163邮箱登录不了怎么办?
  16. 【Vscode】 Vscode常用插件
  17. 迷宫最短路径问题(数据结构4.4.3 拓展)
  18. elasticsearch的使用
  19. Odoo tree视图使用js添加按钮(以及跳转页面)
  20. Axure 9 基本原件样式设置

热门文章

  1. Java面试之项目介绍
  2. LaTex符号大全(LaTeX_Symbols)
  3. 计算机毕业设计论文题目分享
  4. Android智慧城市代码——登录
  5. 深度解读旷视招股书:这557页带你看懂中国AI公司的生意经
  6. F2FS的sysfs调整文件系统参数
  7. dcs world f15c教学_开源声码器WORLD在语音合成中的应用
  8. 双线性映射(Bilinear Maps)实现(有限域、循环群)
  9. 根据Debye公式计算海水介电常数及趋肤深度
  10. PLC1200通过CB1241RS485通讯走modbus rtu连接昆仑通态