作用:融合两个法线向量

用法:

void InitializeFragmentNormal(inout Interpolators i){float3 mainNormal = UnpackScaleNormal(tex2D(_NormalMap, i.uv.xy), _BumpScale);                              // 根据平台自动对方法线贴图使用正确的解码,并缩放法线float3 detailNormal = UnpackScaleNormal(tex2D(_DetailNormalMap, i.uv.zw), _DetailBumpScale);                // 根据平台自动对方法线贴图使用正确的解码,并缩放法线i.normal = BlendNormals(mainNormal, detailNormal);                                                          // 融合法线i.normal = i.normal.xzy;                                                                                    // 交换z和y
}

源码:

详细解析:转自:https://zhuanlan.zhihu.com/p/143069698

融合法线

将主反照率和细节反照率相乘。但不能用法线来做这件事,因为它们是向量。在归一化之前,可以先把他们平均化。

(平均法线)

结果不是很好。主凹凸和细节凹凸都会变平。理想情况下,当其中一个平坦时,它根本不会影响另一个。

我们在这里实际上要尝试做的是结合两个高度场。平均它们没有意义。叠加它们更有意义。当添加两个高度函数时,它们的斜率(也就是它们的导数)也要相加。

我们可以从法线中提取导数吗?

之前,我们通过归一化构造了自己的法线向量

法线贴图包含相同类型的法线,除了它们的Y和Z分量已互换。所以它们的形式是

但是,这些法线已通过标准化过程进行了缩放。所以我们从

开始。

s是任意比例因子。Z分量等于该因子。这意味着我们可以通过将X和Y除以Z来找到偏导数。这仅在Z为零(与垂直表面相对应)时失败。我们的凹凸远没有那么陡峭,所以不必为此担心。

一旦有了导数,就可以将它们相加,以求出总和高度场的导数。然后,我们转换回法线向量。在归一化之前,所得向量为

(增加导数)

这样会产生更好的结果!当组合大部分为平面的贴图时,它的效果很好。但是,合并陡峭的斜率仍然会丢失细节。另一种替代方法是泛白混合。首先,将新法线乘以 MzDz。之所以可以这样做,是因为之后无论如何都要进行归一化。这给了我们向量

然后降低X和Y的缩放比例,得到

这种调整会夸大X和Y分量,从而沿陡峭的坡度产生更明显的凸起。但是,当一个法线平坦时,另一个法线不会改变。

为什么称为泛白混合?

该方法由Christopher Oat在SIGGRAPH’07上首次公开描述。它用于AMD的Ruby:Whiteout演示中,因此得名。

(泛白混合法线,和反照率)

UnityStandardUtils包含BlendNormals函数,该函数还使用泛白混合。因此,让我们开始这个功能。它还可以标准化结果,因此我们不再需要自己做。

BlendNormals是什么样的?

它执行与我们完全相同的计算。

BlendNormals相关推荐

  1. Ogre骨骼动画分析

    http://3dlearn.googlecode.com/files/ogre skeleton animation.pdf 欢迎指出文中错误 1  前言 骨骼蒙皮动画分两步骤进行:根据时间插值更新 ...

  2. Unity Shader 常规光照模型代码整理

    Unity Shader 常规光照模型代码整理 本次整理在Unity中几种常见的光照模型,包含 1.BlinnPhong(常规光照模型) 2.ForwardRender(多灯光带有衰弱前向渲染) 3. ...

  3. Unity Shader-真实下雨路面

    简介 根据YouToBe => PolyToots实现 效果: 1.准备插件Amplify Shader Editor(这里我使用的是1.6.4最新版) 2.贴纸和切图d 水波纹法线切图 地板法 ...

  4. [笔记]unity渲染类零碎代码记录(100多条)

    1.获得renderTexture上的4个角的近裁面位置 cam = GetComponent<Camera>(); Matrix4x4 inverseViewProjectionMatr ...

  5. Unity Shader - 水体交互

    水体交互 水体交互效果在游戏中是一个很常见的需求,这里简单实现一个可交互的水体. 本篇文章主要是介绍水体交互的实现思路,水体的渲染这里就不再详细介绍,网上很多关于水体的渲染方法很多,可以自己百度.Go ...

  6. UnityShader凹凸感

    1._TexelSize:纹理以这个为后缀, 后2个则是像素的数量如256x128.那么后2个就是256和128.而前两个值为x = 1/256, y = 1 / 128 2.有限差分近似 image ...

  7. 进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

    目录 1 没有UV坐标的纹理 1.1 不适用默认UV 1.2 收集表面属性 1.3 定制表面 1.4 没有切线空间 1.5 三向着色器 2 三面纹理化 2.1 基于位置的纹理映射 2.2 组合所有的三 ...

  8. shader冰冻效果

    下面是shader的代码: Shader "Forzen/FrozenEffect_myself" {Properties{[Header(Main infos)]_MainTex ...

  9. UnityShader切线空间学习

    此处连接凹凸感文章现在需要应用在立体的形状上 1.可视化切线空间 /// <summary> /// 可视化切线空间 /// </summary> public class T ...

最新文章

  1. java oracle分页_oracle 分页存储过程和java代码
  2. 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
  3. 基于WINCE6.0的nandflash驱动(基于K9F1G08U0B)
  4. 通话录音_谁说苹果手机不能通话录音?四种方法教给你!别再说你不知道了
  5. 百度广告点击软件_网络营销百问百答之64,如何提升企业百度广告点击率
  6. 手机没电不用慌 荣耀门店推充电站服务为你解忧
  7. 桌面环境选择_Fedora 30 正式版发布:引入 Deepin 桌面环境(DDE)
  8. php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...
  9. 对于防止按钮重复点击的尝试
  10. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
  11. GEE:快速下载数字高程DEM数据
  12. 还挺好看!用命令行画思维导图;66天机器学习之旅;斯坦福CS234 强化学习课程;哈佛CS50 计算机科学导论课程;前沿论文 | ShowMeAI资讯日报
  13. 界面控件DotNetBar for WinForms使用教程:highlight组件使用教程
  14. MTK6589双卡卡1或是卡2拨出电话
  15. Android MTK 预制应用遇到的问题
  16. 粒子群matlab工具箱,Matlab粒子群算法工具箱使用方法及实例演示
  17. LPC1768PWM实验
  18. java文字版格斗游戏。
  19. 百度百聘企业简单信息获取
  20. dubbo源码导入eclipse

热门文章

  1. JL杰理AC6082 AC6084替换AC1082 AC1074 MP3解码芯片方案
  2. 如何抓住私域流量,让实体店“活”起来!
  3. 迅捷电子相册快速生成视频的方法--win10专业版
  4. 介绍一下电脑管家小团队VIP版本,限时免费2个月开放体验啦!
  5. 升级至win10 最新版本10.0.17134,远程桌面连接Window Server时报错信息如下
  6. 美团是用html开发,剖析美团网站前端的组件化开发经验
  7. 2020年12月CFA一级二级三级百题预测
  8. 谷歌TPU研究论文:专注神经网络专用处理器
  9. 序列线性卷积matlab,有限长序列的线性卷积和圆周卷积
  10. 电影网网站优化-图片适配篇