Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)

这篇具有很好参考价值的文章主要介绍了Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、图片是否有法线贴图的视觉区别

二、有视觉区别的原因

三、法线贴图的作用

四、信息是如何存进去的

五、自己写一个Shader用到法线贴图

六、注意事项

七、作者的话


前言

本小节会给大家解释,什么是法线贴图?为什么法线贴图会产生深度?我们怎么自己写一个shader,用上法线贴图

一、图片是否有法线贴图的视觉区别

(如图1所示)我们本来有一张普通的图,看上去非常明显是平面的,如果加了法线贴图就会变成立体的感觉(如图2所示)。

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图1 普通图片
Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图2 加了法线贴图的图片

二、有视觉区别的原因

平面和立体最重要的区别是有深度,多了一个维度,

但是多的这个维度是怎么在2D图片中显示出来的?

答:有了不同的深度,光线照射的情况会不一样。

例:如果我画了一座山,放在桌面上,那么这个画上面会接收到相同的光线。(如图3所示)

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图3 平面的山

哪里都能照到,随便照,因为不存在遮挡关系,都是亮的。


但是如果是3D的山,光线就会存在遮挡问题,有些地方就照不到,有些地方能照到,照不到的地方接收到的就是黑色的光线,或者只能接到左边来的光线,右边来的光线只能接到一半。(如图4所示)

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图4 看起来立体的山

因为有光线的加入,我们才会感觉东西立体了。

三、法线贴图的作用

我们把是否能接收到光的信息提前存进去,让该亮的地方亮,该暗的地方暗。

四、信息是如何存进去的

光线射过来的时候,都是一样的,遇到物体以后会改变他的方向。

我们把物体每一个点反射的光线方向存起来,最后再画出来就可以了。

由于每一个点都会有不同方向的反射光线(如图5所示),我们把光线的方向都用向量表示,但,全部用数字记录有点麻烦,比如(0.5,0.6,-0.2)

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图5 反射光线向量

法线贴图就解决了这个问题:

图片刚好有rgb:
r(0-255)→x(-1,1)

g(0-255)→y(-1,1)

b(0-255)→z(-1,1)

例如:图一中的法线贴图(如图6所示)

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图6 图1的法线贴图
Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图7 选取了一个点

此时,这里的rgb为(84,128,247),换成向量就为(-0.34,0.008,0.97)

同样(-0.34,0.008,0.97)换成rgb就是(84,128,247),正反都成立。

那么就可以把一大堆信息,变成一个图片,想知道这点的光线信息,就去读它的颜色。

以前我们想看立体视角,必须要模型,现在,我们只需要法线贴图,就很省性能。但是,有个缺点,就是如果看影子,它还是正圆的,毕竟是贴图造出来的幻觉,并不是真凹进去了。

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图8 法线贴图的影子

PS:为什么法线贴图都是蓝色的?

如图5所示,决定光线是否会穿出纸面,被人眼看见的是z向量,z向量对应的是b(0-255)蓝色,大部分颜色都需要被我们看见,所以法线贴图大多是蓝色的。

五、自己写一个Shader用到法线贴图

Shader "Custom/006_nomalMap"
{
    Properties
    {
        //首先先放两个图片进来
        //正常图片
        _MainTexture ("Texture", 2D) = "white" {}
        //法线图片
        _MainNormal ("NormalTexture",2D) = "bump" {}
    }

    SubShader
    {
        CGPROGRAM

        //引入已有的脚本
        #pragma surface surf Lambert

        //把上面资源里的图,接收到shader语法里
        //注意事项:名字必须和上面一样
        sampler2D _MainTexture;
        sampler2D _MainNormal;

        //待会我们需要把 图片数据 转换成 坐标数据
        struct Input
        {   
            //准备接受主图的坐标数据
            float2 uv_MainTexture;
            //准备接收法线图片的坐标数据
            float2 uv_MainNormal;

            //注意事项:名字只能是上面的名字前面加uv
        };

        //写了一个方法,把shader原有的数据引入进来  把输出的接口也拿过来
        void surf(Input IN, inout SurfaceOutput o )
        {
        //改反射的内容    获取图片上的rgba改成坐标信息,但我们只要rgb的数据
         o.Albedo = tex2D(_MainTexture,IN.uv_MainTexture).rgb;

         //改法线信息    //这里因为rgb的数据是(0,1),但法线数据是(-1,1),所以需要二次转换一下
         o.Normal = UnpackNormal(tex2D(_MainNormal,IN.uv_MainNormal));

         //备注:这里的unpackNormal的全称是UnpackNormalFromTexture,
         //     意思是,从texture恢复(解压)成Normal
        }

        ENDCG
        }

        FallBack "Diffuse"
  }

六、注意事项

在使用法线贴图的时候,注意图片格式必须是法线格式。(如图9所示)

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图),Unity中写shader,unity,贴图,游戏引擎
图9 贴图格式

七、作者的话

鸽了大家这么久,真对不住,主要是最近一直997,现在稍微闲一点点了,作者立马接上了。非常感谢大家的支持,爱你们哟~文章来源地址https://www.toymoban.com/news/detail-852017.html

到了这里,关于Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Unity中Shader的PBR的基础知识与理论

    Unity中Shader的PBR的基础知识与理论

    Unity中Shader的PBR的基础知识与理论 PBR(Physically Based Rendering),中文译为基于物理的渲染 PBR是一种渲染方式 ,是使用基于物理原理和微微、平面理论的光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念 PBR是一系列技术的集合 ,包含GI、PBS等。 P

    2024年04月26日
    浏览(8)
  • 【数据分析之道-基础知识(十一)】面向对象

    【数据分析之道-基础知识(十一)】面向对象

    ✍ 作者简介: i阿极 ,CSDN Python领域新星创作者, 专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中全部文章内容

    2024年02月05日
    浏览(21)
  • Flume基础知识(十一):Flume自定义接口

    Flume基础知识(十一):Flume自定义接口

    1)案例需求 使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统。 2)需求分析 在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要 发送到不同的分析系统。此时会用到 Flume 拓扑结构中的 Mul

    2024年02月03日
    浏览(10)
  • 【STM32】基础知识 第十三课 中断

    【STM32】基础知识 第十三课 中断

    今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断的基本概念, 配置和使用方法. 中断在嵌入式系统中扮演着重要角色, 使系统能够快速响应外部事件, 提高系统的实时性和效率. 中断 (Interrupt) 是单片机和其他嵌入式系统中的一种重要机制, 用于在发生特定

    2024年02月17日
    浏览(25)
  • 【STM32】基础知识 第十课 CubeMx

    【STM32】基础知识 第十课 CubeMx

    CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者通过直观的图像界面快速完成 STM32 微控制器的硬件配置, 外设初始化以及中间件设置等工作. 通过 CubeMX, 开发者可以大幅提高开发效率, 降低开发难度, 尤其是对于刚接触 STM32 的新

    2024年02月05日
    浏览(9)
  • Hive基础知识(十一):Hive的数据导出方法示例

    Hive基础知识(十一):Hive的数据导出方法示例

    1)将查询的结果导出到本地 2)将查询的结果格式化导出到本地(加上一个以“,”隔开数据的格式) 3)将查询的结果导出到 HDFS 上(没有 local) 基本语法:(hive -f/-e 执行语句或者脚本 file) 导出的数据中有两个数据源,其中除了主信息之外,还包括记录主数据信息的元数据

    2024年01月22日
    浏览(10)
  • 【前端知识】React 基础巩固(三十一)——Redux的简介

    概念 纯函数(确定的输入一定产生确定的输出,函数在执行过程中不产生副作用): 在程序设计中,若一个函数符合以下条件,那么这个函数就被称为纯函数 此函数在相同的输入值时,需产生相同的输出 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产

    2024年02月16日
    浏览(15)
  • vue 3 第三十一章:状态管理(Pinia基础知识)

    状态管理是现代 Web 应用开发中的一个重要概念。Vue 3 中的状态管理库 Pinia ,是一个基于 Vue 3 Composition API 的状态管理库,它提供了一种 简单 、 灵活 的方式来管理应用程序的状态,同时还具有 高性能 和 可扩展性 。 Pinia 在某种程度上来说,也可以被叫做 Vuex5 ,因为它结合

    2024年02月07日
    浏览(111)
  • css基础知识十一:CSS3新增了哪些新特性?

    css基础知识十一:CSS3新增了哪些新特性?

    一、是什么 css,即层叠样式表(Cascading Style Sheets)的简称,是一种标记语言,由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准,是向后兼容的,CSS1/2的特性在CSS3 里都是可以使用的 CSS3 也增加了很多新特性,为开发者带来了更佳的开发体验 从几个维度列举一些

    2024年02月11日
    浏览(16)
  • 【STM32】基础知识 第十四课 串口通信: 深入探究与应用

    【STM32】基础知识 第十四课 串口通信: 深入探究与应用

    在嵌入式系统中, 串口通信是一种常见的通信方式, 特别是在单片机领域. STM32 系列单片机提供了强大的串口 (UART) 功能, 可支持多种通信模式. 今天小白将带领大家深入探讨 STM32 的串口通信, 包括其基本原理, 配置方法, 中断处理及实际应用示例. 串口通信 (Serial Communication) 是一

    2024年02月15日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包