本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈》一 书中的第2章,第2.5节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 法线贴图

在当今的游戏开发可编程管线中,我们最常使用的一种贴图方式就是法线贴图。使用法线贴图我们可以在低分辨率的模型上实现一种模拟的高分辨率效果。因为不同于对每个顶点(逐顶点级)进行光照计算,我们是将法线贴图中的各个像素点作为模型的法线,这样我们的光照呈现高分辨率的效果,同时模型保持低多边形数。
在三维计算机图形学中,法线贴图也叫“DOT3 (仿立体)凹凸映射”,是一种用于模拟凸起和凹陷的光照效果——凹凸贴图的实现技术。它是用来在不增加额外多边形的情况下添加更多的细节。该技术的一个常见用途是通过一个高多边形模型或高度图形成法线贴图,这样就显著地提高了低多边形模型的表现效果以及细节。
法线贴图通常存储在一个普通的RGB图片,它的RGB分量分别对应了曲面法线的X,Y,Z坐标。
前面的文字引述自维基百科。
现在已经有很多种方法可以用来制作法线贴图,例如,应用程序CrazyBump和N2DO采用的是二维数据并转换为你所需要的法线数据。其他的应用程序如Zbrush和Mudbox 采用的是三维造型数据并转换为法线数据。实际上制作法线贴图的过程已经超出了本书的范围,但上文提供的几个链接可以帮助你学习如何制作法线贴图。
Unity通过UnpackNormals()函数(法线解压函数)来使用法线贴图,这使得在表面着色范围内为我们的着色器添加法线的过程变得相当容易。让我们来看看它是如何来完成的。

2.5.1 准备工作

创建一个新的材质和着色器,在场景视图中将它们设置到一个新物体上。这样,我们就拥有了一个干净的工作空间,然后就可以在场景中看看我们的法线贴图技术了。
你需要为本节准备一张纹理贴图,当然你也可以在本书附随的Unity工程文件中找到。
本书自带了一个法线贴图的例子,如下所示:

2.5.2 如何操作

1.在Properties块中添加一个颜色和一个纹理属性:

2.在CGPROGRAM描述语句下的subshader内声明相应的属性,以便我们在CG程序片段中能够访问上述的两个属性:

3.然后,我们需要确定我们已经使用合适的变量对Input结构体进行了更新,这样我们就可以将模型的UV应用到法线贴图上了。

4.最后,我们使用Unity内置的UnpackNormal()函数从法线贴图当中提取法线信息。然后你只需将这些新的法线信息应用到Surface Shader的输出即可:

下图展示的是应用法线贴图渲染之后的结果:

2.5.3 实现原理

表现法线贴图效果的数学原理其实超出了本章的学习范围,但Unity已经在很多方面帮我们做好了这一切。它为我们提供了相应的函数,这样我们不需要重复地编写代码。这也解释了为什么表面着色器是一种非常高效的着色器编写方式。
如果你查看Unity自带的UnityCG.cginc文件(可以在Unity安装目录下的Data文件中找到),你就会找到UnpackNormal()函数的定义。当你在着色器内声明该函数时,Unity将对你提供的法线贴图进行处理,并将运算后的正确数据直接返回给你,这样你就可以逐像素将法线信息应用到光照函数内了。这对我们来说真的是节省了大量的时间!
当你使用UnpackNormal()函数对法线贴图进行处理后,你会将处理后的值返回到SurfaceOutput结构体内,这样它就可以在光照函数中进行使用了。这一步工作是由代码“o.Normal= normalMap.rgb;”来完成的。

2.5.4 更多内容

你也可以在你的法线贴图着色器中添加一些控件,以便让用户可以自行调整法线贴图的强度。我们可以很容易地通过修改法线贴图变量的x和y坐标来完成,然后将修改后的值返回到计算中。
1.在Properties块中另外又添加一个属性,将其命名为_NormalMapIntensity,如下代码所示:

2.确保你在SubShader函数中也声明了该属性:

3.将经过解压后的法线贴图变量值的x和y坐标值均乘上_NormalMapIntensity,将计算后的值作为法线贴图的变量值。现在你就可以让用户在材质Inspector面板上调整法线贴图的强度了。

下图为使用我们提供的标量值来修改法线贴图的结果图:

《Unity着色器和屏幕特效开发秘笈》—— 2.5 法线贴图相关推荐

  1. 《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第3章,第3.4节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  2. 《Unity着色器和屏幕特效开发秘笈》—— 2.1 引言

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第2章,第2.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  3. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.9节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth ...

  4. 《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色...

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第1章,第1.7节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  5. 《Unity着色器和屏幕特效开发秘笈》—— 第3章 利用镜面反射让游戏闪耀起来...

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第3章,第3.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  6. 《Unity着色器和屏幕特效开发秘笈》—— 1.1 引言

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第1章,第1.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  7. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.6 法线映射

    本节书摘来自华章计算机<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.6节,作者 [英]艾伦朱科尼(Alan Zucconi)[美]肯尼斯拉默斯(Kenneth ...

  8. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.6 法线映射

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.6节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth ...

  9. unity着色器和屏幕特效开发秘笈_Oculus研发分享:开发移动VR内容时应避免的PC渲染技术...

    查看引用/信息源请点击:映维网 开发移动VR内容时应避免的PC渲染技术 (映维网 2019年11月25日)有不少开发者都是以与PC相同的方式来开发Quest游戏,但这可能会导致优化性能方面出现大量困难 ...

最新文章

  1. [BZOJ4033][HAOI2015]树上染色
  2. linux删除vip 绑定,linux – VIP不会从备份keepalived中删除
  3. python的print格式化输出的format()方法和%两种方法
  4. 用户和组相关配置文件
  5. Flask的csrf_token的用法
  6. [VC]strcpy memcpy memset区别与简介
  7. 检测php加密方式,一种php加密方式
  8. Linux下openSSL安装并颁发证书
  9. getset原子性 redis_对比各类分布式锁缺陷,抓住Redis分布式锁实现命门
  10. Crypto-Enigma密码机原理
  11. QT中事件及事件处理
  12. Intel 82576网卡
  13. echarts柱状图改变标签的位置及柱状图颜色
  14. Unsupervised Question Answering by Cloze Translation
  15. java实现字符串反转
  16. 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)
  17. html全选替换,网站上如何实现全选与反选
  18. MongoDB——实战演练
  19. 2021年终总结:平凡的一年
  20. 开启虫洞的频率_仅用几段音频、扬声器和灯就能打开“虫洞”,这是真的?内附视频...

热门文章

  1. 因为一顿饭,我被隔离了
  2. ChatGPT创始人采访 | GPT-4报告中文版
  3. Java从不同目录获取文件方式
  4. SACK Panic的POC演示与修复建议
  5. word 为数学公式添加编号
  6. C++开源库:Json解析:JsonCpp实践
  7. IKAnalyzer词典占用内存大小分析
  8. 让照片里的你更好看的办法
  9. 双电梯电梯调度算法的简单分析
  10. BAPI:创建退货订单-BAPI_CUSTOMERRETURN_CREATE