为什么要用三面映射

首先说说为什么要用三面映射吧。在很多情况下会遇到uv不规范,甚至没有uv的模型(至少我遇到了没有uv的模型),在这种情况下,如果还需要使用纹理映射,就需要生成合适的uv。
另外的,在对地形(Terrain)进行uv坐标的指定是效率非常低下的,因此针对地形进行纹理映射,推荐采样三面映射。
三面映射(Tri-Planar-Mapping)提供了一种基于世界坐标(WorldSpacePosition)生成uv坐标的方式,虽然不能完全正确的映射模型的uv,但在应用一些通用的材质时,有着不错的效果。

三面映射原理

三面映射需要解决的,其实就是将世界坐标映射到uv坐标对纹理进行采样。我们知道uv坐标是二维向量,而世界坐标是三维向量,所以需要一种方式,使用世界坐标对贴图采样。
一种思路是取世界坐标的xy,yz,xz分量分别对纹理进行采样,然后进行混合。
使用xy分量采样时,并没有把z分量考虑进去,如果只用这个结果的话,在具体模型上就会出现z方向的拉伸。使用yz分量同样如此。所以在最后进行结果混合时,需要一个比较合适的混合因子,这个混合因子能够说明在xyz方向的比例。
我们可以使用世界坐标下的法线(worldNormal),这个法线点乘x轴向量(1,0,0)得到的结果能够反映该面在x方向的朝向比例,这个结果正好能作为偏向x方向的插值因子。在其它方向同理。有了这个思路,就可以进行代码操作了。

Unity Shader的实现(这里只演示颜色关键部分):

//针对不同方向进行采样,并且获得对应朝向的mask进行插值
fixed4 SampleTextureAsWorld(float2 uvXY, float2 uvYZ, float2 uvXZ, fixed3 worldNormal){fixed4 colorXY = tex2D(_Albedo, uvXY);fixed4 colorYZ = tex2D(_Albedo, uvYZ);fixed4 colorXZ = tex2D(_Albedo, uvXZ);float maskX = abs(dot(worldNormal, fixed3(1,0,0)));float maskY = abs(dot(worldNormal, fixed3(0,1,0)));fixed4 finalColor = lerp(colorXY, colorYZ, maskX);finalColor = lerp(finalColor, colorXZ, maskY);return finalColor;
}
//片段着色器中非常容易:
fixed4 frag(v2f i):SV_TARGET{fixed3 worldNormal = normalize (i.worldNormal);return SampleTextureAsWorld(i.worldPos.xy, i.worldPos.yz, i.worldPos.xz, worldNormal);
}

使用UE4实现:

最后用一个简单的茶杯,随便上一张CC0的贴图预览效果:

法线

三面映射当然可以采样法线贴图啦,最后额外进行一个(0,0,1)的Mask就行了。

写在最后

建模不规范,材质两行泪(别再遇到那种没有uv的或者uv不规范的模型了)

Tri-Planar-Mapping[三面映射]相关推荐

  1. 渲染TA实战:三方向映射 UE4

    大家好我是来自搜狐畅游引擎部TA组的小源小榞小圆,这次是分享关于三方向映射纹理的做法. 三方向映射在制作地形贴图,和一些需要在任意角度覆盖模型的材质会比较常用到.比如苔藓.污渍.锈迹.以及最常用到的地 ...

  2. 三平面映射TriPlanar

    shader效果中存在"缝隙":(最后的代码中已经注释的很清楚了) 出现缝隙的原因:因为UV坐标是不连续的,所以会有缝隙...(法线的T,B,是根据U和V生成的,所以用法线也会有裂 ...

  3. Cache超清晰逻辑详解(cache的三种映射)

    在说之前要向大家安利一个网站,http://www.ecs.umass.edu/ece/koren/architecture/Cache/tutorial.html,这是马萨诸塞大学安姆斯特分校的体系 ...

  4. Object/Relation Mapping 对象关系映射

    对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应 ...

  5. mybatis(三) XML映射器之select、update、delete、insert标签

    目录 文章目录 3.XML映射器 3.1.select 3.1.1.单表查询 3.1.2.select标签属性列表 3.1.3.parameterType属性 3.1.4.resultType 3.1 ...

  6. matlab对数极坐标,Log-Polar Mapping(对数极坐标映射)

    对数极坐标图像几何学首先是从生物视觉系统的视网膜生理结构获得灵感的,具有数据压缩特性.在人工视觉系统中,与常见的笛卡尔坐标系中的图像对比,在没有减小视域大小和视网膜中心部分图像的分辨率的情况下,对数极 ...

  7. python序列类型包括哪三种映射类型_Python序列类型包括字符串、列表和元组三种,列表是Python中唯一的映射类型...

    Python序列类型包括字符串.列表和元组三种,列表是Python中唯一的映射类型 更多相关问题 [填空题] 秦以后的地方基本建制为().但西汉因分封形成了(). [单选] 药物过敏性口炎的临床特征为 ...

  8. 计算机组成原理(3)三级存储 局部性原则 存储器性能指标 扩展 DRAM编址方式 cache 三种映射 替换策略

    三级存储 RAM,随机存储 ROM,只读存储 ,MROM,PROM不可编程,可编程 EPROM,E^2PROM 紫外,电 擦除 三级存储内存,cache,外存 局部性原则 时间局部性:一条指令或数据, ...

  9. python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发

    python中表达式4+0.5值的数据类型为?_后端开发 python中表达式4+0.5值的数据类型为浮点型,因为4是整型,0.5是浮点型,在python中规定整型和浮点型相加,结果是浮点型,这是为了 ...

最新文章

  1. 企业云桌面-06-安装数据库服务器-051-vCdb01
  2. C++对象的内存分析(5)
  3. 在Linux下常用的命令
  4. ERP开放平台定制化远程高效协作秘笈
  5. 数据解析学习笔记(正则解析、bs4解析、xpath解析)
  6. 服务器cpu_服务器CPU与GPU协同运算加速三巨头竞争
  7. 房地产税迟早要来,而且会带来房价小涨。
  8. 俯瞰大雾弥漫下的鄱阳湖二桥
  9. 阿里双十一技术揭秘——双十一 手淘技术用了这几招
  10. EF 4.1 一些操作
  11. 基于Django的网上书城系统
  12. PS2021最新下载Photoshop2021最新中文下载安装PS下载安装
  13. 共线条件方程及其应用
  14. python好学吗要有什么基础-Python好学吗难不难?0基础能学会吗?
  15. 科研试剂半乳糖金刚烷衍生物934591-76-1,5-乙酰氨基-7,8,9-三-O-乙酰基-5-N,4-O-羰基-3,5-二脱氧-2-S-苯基-2-硫代-β-D-甘油-D-半乳-2-吡喃神经氨酸甲酯
  16. 浏览器点击链接打开指定APP详解
  17. 服务器系统盘大文件检测指令,服务器系统盘大文件检测指令
  18. CSS3的@keyframes用法详解:
  19. 随机颜色十六进制(#ffffff)或rgb格式
  20. Android 7.0/8.0 安装APK时解析包错误问题

热门文章

  1. 不懂程序看的明白《黑客帝国》吗?
  2. SaaS的商业模式是如何影响软件公司估值
  3. docker暴露端口、端口映射
  4. 9个最有趣的代码注释
  5. java中子类会继承父类的构造方法吗
  6. 网络控制系统仿真:Truetime2.0工具箱安装(win10 + matlab R2017b)
  7. nas 软件 性能测试,铁威马NAS数据传输性能测试
  8. 计算机课自我介绍二百字,自我介绍作文200个字
  9. 200 万年薪!西交大 2 位计算机博士入选华为天才少年
  10. 44特征02—— 对角化: 代数重数与几何重数、可对角化的概念