BlendNormals
作用:融合两个法线向量
用法:
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相关推荐
- Ogre骨骼动画分析
http://3dlearn.googlecode.com/files/ogre skeleton animation.pdf 欢迎指出文中错误 1 前言 骨骼蒙皮动画分两步骤进行:根据时间插值更新 ...
- Unity Shader 常规光照模型代码整理
Unity Shader 常规光照模型代码整理 本次整理在Unity中几种常见的光照模型,包含 1.BlinnPhong(常规光照模型) 2.ForwardRender(多灯光带有衰弱前向渲染) 3. ...
- Unity Shader-真实下雨路面
简介 根据YouToBe => PolyToots实现 效果: 1.准备插件Amplify Shader Editor(这里我使用的是1.6.4最新版) 2.贴纸和切图d 水波纹法线切图 地板法 ...
- [笔记]unity渲染类零碎代码记录(100多条)
1.获得renderTexture上的4个角的近裁面位置 cam = GetComponent<Camera>(); Matrix4x4 inverseViewProjectionMatr ...
- Unity Shader - 水体交互
水体交互 水体交互效果在游戏中是一个很常见的需求,这里简单实现一个可交互的水体. 本篇文章主要是介绍水体交互的实现思路,水体的渲染这里就不再详细介绍,网上很多关于水体的渲染方法很多,可以自己百度.Go ...
- UnityShader凹凸感
1._TexelSize:纹理以这个为后缀, 后2个则是像素的数量如256x128.那么后2个就是256和128.而前两个值为x = 1/256, y = 1 / 128 2.有限差分近似 image ...
- 进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】
目录 1 没有UV坐标的纹理 1.1 不适用默认UV 1.2 收集表面属性 1.3 定制表面 1.4 没有切线空间 1.5 三向着色器 2 三面纹理化 2.1 基于位置的纹理映射 2.2 组合所有的三 ...
- shader冰冻效果
下面是shader的代码: Shader "Forzen/FrozenEffect_myself" {Properties{[Header(Main infos)]_MainTex ...
- UnityShader切线空间学习
此处连接凹凸感文章现在需要应用在立体的形状上 1.可视化切线空间 /// <summary> /// 可视化切线空间 /// </summary> public class T ...
最新文章
- java oracle分页_oracle 分页存储过程和java代码
- 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
- 基于WINCE6.0的nandflash驱动(基于K9F1G08U0B)
- 通话录音_谁说苹果手机不能通话录音?四种方法教给你!别再说你不知道了
- 百度广告点击软件_网络营销百问百答之64,如何提升企业百度广告点击率
- 手机没电不用慌 荣耀门店推充电站服务为你解忧
- 桌面环境选择_Fedora 30 正式版发布:引入 Deepin 桌面环境(DDE)
- php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...
- 对于防止按钮重复点击的尝试
- 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
- GEE:快速下载数字高程DEM数据
- 还挺好看!用命令行画思维导图;66天机器学习之旅;斯坦福CS234 强化学习课程;哈佛CS50 计算机科学导论课程;前沿论文 | ShowMeAI资讯日报
- 界面控件DotNetBar for WinForms使用教程:highlight组件使用教程
- MTK6589双卡卡1或是卡2拨出电话
- Android MTK 预制应用遇到的问题
- 粒子群matlab工具箱,Matlab粒子群算法工具箱使用方法及实例演示
- LPC1768PWM实验
- java文字版格斗游戏。
- 百度百聘企业简单信息获取
- dubbo源码导入eclipse
热门文章
- JL杰理AC6082 AC6084替换AC1082 AC1074 MP3解码芯片方案
- 如何抓住私域流量,让实体店“活”起来!
- 迅捷电子相册快速生成视频的方法--win10专业版
- 介绍一下电脑管家小团队VIP版本,限时免费2个月开放体验啦!
- 升级至win10 最新版本10.0.17134,远程桌面连接Window Server时报错信息如下
- 美团是用html开发,剖析美团网站前端的组件化开发经验
- 2020年12月CFA一级二级三级百题预测
- 谷歌TPU研究论文:专注神经网络专用处理器
- 序列线性卷积matlab,有限长序列的线性卷积和圆周卷积
- 电影网网站优化-图片适配篇