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

目录

前言

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

二、有视觉区别的原因

三、法线贴图的作用

四、信息是如何存进去的

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

六、注意事项

七、作者的话


前言

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

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

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

图1 普通图片
图2 加了法线贴图的图片

二、有视觉区别的原因

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

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

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

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

图3 平面的山

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


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

图4 看起来立体的山

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

三、法线贴图的作用

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

四、信息是如何存进去的

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

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

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

图5 反射光线向量

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

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

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

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

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

图6 图1的法线贴图

图7 选取了一个点

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

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

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

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

图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所示)

图9 贴图格式

七、作者的话

鸽了大家这么久,真对不住,主要是最近一直997,现在稍微闲一点点了,作者立马接上了。非常感谢大家的支持,爱你们哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码分析(BeanFactory)

文章目录 Spring源码分析(BeanFactory)一、BeanFactory二、ApplicationContext 的父系1、HierarchicalBeanFactory2、ListableBeanFactory3、EnvironmentCapable4、ApplicationEventPublisher5、MessageSource6、ResourcePatternResolver 三、Applicatio…

了解这些技术:Flutter应用顺利登陆iOS平台的步骤与方法

引言 🚀 Flutter作为一种跨平台的移动应用程序开发框架,为开发者提供了便利,使他们能够通过单一的代码库构建出高性能、高保真度的应用程序,同时支持Android和iOS两个平台。然而,完成Flutter应用程序的开发只是第一步…

android QtScrcpy 共享屏幕 获取本地Address

android QtScrcpy https://gitee.com/B arryda/QtScrcpy scrcpy - 手机无线投屏到电脑 https://zhuanlan.zhihu.com/p/80264357?utm_sourcewechat_session public String getLocalIpAddress() { String ipv4; List<NetworkInterface> nilist …

【鹅厂摸鱼日记(一)】(工作篇)认识八大技术架构

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多知识   &#x1f51d;&#x1f51d; 认识八大架构 1. 前言2. 架构简介&…

容器网络测试关键问题

资料问题 主要影响客户体验, 低级问题. 类似于单词拼写错误, 用词有歧义&#xff0c;等。 另一点是&#xff0c;我们的用户文档&#xff0c;主要偏向于技术向的描述&#xff0c;各种参数功能罗列。友商有比较好的最佳实践操作说明。我们后面也会都增加这样的最佳实践。golang o…

【Spring】SpringBoot整合ShardingSphere并实现多线程分批插入10000条数据(进行分库分表操作)。

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、ShardingSphere简介 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar&#xff08;计划中&#xff09;这3款相互独立的产品组成…

【2024 信息素养大赛c++模拟题】算法创意实践挑战赛(基于 C++)

一、 比赛简介 国务院发布《国务院关于印发新一代人工智能发展规划的通 知》&#xff0c;明确实施全民智能教育项目。教育部印发《2019 年教育信息 化和网络安全工作要点》&#xff0c;推动在中小学阶段设置人工智能相关课 程&#xff0c;逐步推广编程教育。本赛项是在贯彻…

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中&#xff0c;我们讲解了如何使用汇编来编写 LED 灯驱动&#xff0c;实际工作中是很少用到汇编去写嵌入式驱动的&#xff0c;毕竟汇编太难&#xff0c;而…

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display&#xff0c;即平视显示器&#xff0c;以前应用于军用飞机上&#xff0c;旨在降低飞行员需要低头查看仪表的频率。起初&#xff0c;HUD通过光学原理&#xff0c;将驾驶相关的信息投射…

1.Git是用来干嘛的

本文章学习于【GeekHour】一小时Git教程&#xff0c;来自bilibili Git就是一个文件管理系统&#xff0c;这样说吧&#xff0c;当多个人同时在操作一个文件的同时&#xff0c;很容易造成紊乱&#xff0c;git就是保证文件不紊乱产生的 包括集中式管理系统和分布式管理系统 听懂…

00 - Logic Circuit 简介 -- 与或非门

---- 整理自B站UP主 踌躇月光 的视频 1. Logic Circuit Logic Circuit 下载地址 界面如下&#xff0c;实际使用可下载体验 2. 与或非门

HTML常用的图片标签和超链接标签

目录 一.常用的图片标签和超链接标签&#xff1a; 1.超链接标签&#xff1a; 前言: 超链接的使用&#xff1a; target属性: 1)鼠标样式&#xff1a; 2)颜色及下划线: 总结: 2.图片标签&#xff1a; 前言: img的使用: 设置图片&#xff1a; 1.设置宽度和高度: 2.HTM…

排序算法-归并排序

Leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 归并&#xff1a;将原始数组划分为若干个子数组&#xff0c;然后将这些子数组分别排序&#xff0c;最后再将已排序的子数组合并成一个有序的数组。是一种分治思想 思路&#xff1a; 1.分 2.治 3.怎么治 …

equals练习题

练习1编写Order类&#xff0c;有int型的orderId&#xff0c;String型的orderName&#xff0c;相应的getter()和setter()方法&#xff0c;两个参数的构造器&#xff0c; 重写父类的equals()方法&#xff1a;public boolean equals(Object obj)&#xff0c;并判断测试类中创建的两…

力扣1047. 删除字符串中的所有相邻重复项

思路&#xff1a;消消乐的感觉&#xff0c;就先想到栈&#xff1b;用一个栈存放遍历过的元素&#xff0c;和遍历中的下一个元素相比&#xff0c;相同则出栈&#xff0c;不同则入栈&#xff0c;最终栈内剩余的就是不相同的元素。 class Solution {public String removeDuplicat…

nodejs 中导入的包名中带有 # 是什么意思?

nodejs 中可以使用 # 号自定义本地 js 模块的路径&#xff0c;就像我们常在 vue 中使用 / 作为路径别名一样。 使用方法 首先&#xff0c;在 pacakge.json 中定义&#xff1a; // package.json {"imports": {"#internal/*.js": "./src/internal/*.…

报错:OSError: [Errno 22] Invalid argument: ‘D:\\pycharm\\png\t.PNG‘ 解决办法

在使用Python导入文件时&#xff0c;系统报了这个错误。查了一下&#xff0c;发现是Python会将‘\’误认为是转义字符。比如\t&#xff0c;\n等也会导致报错。 解决办法&#xff1a; 1&#xff0c;直接在路径前面加“r”。在字符串赋值的时候&#xff0c;前面加’r’可以防止…

Debian 配置国内软件源

为什么需要&#xff1f; Debian安装好之后默认是没有软件源的&#xff0c;只能通过本身的光盘上的软件进行安装&#xff0c;这样明显是不能够满足我们的需要的&#xff0c;考虑到国内的上网速度以及环境&#xff0c;配置一个国内的阿里镜像源是最好的选择。 使用 sudo vim /…

C语言第三十九弹---预处理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 预处理 1、预定义符号 2、#define定义常量 3、#define定义宏 4、带有副作用的宏参数 5、宏替换的规则 6、宏和函数的对比 总结 在C语言中&#xff0c;预处…

【C++】多态的原理

目录 一、虚函数表 1、虚函数表的定义 2、虚函数表特性 3、虚表的打印 二、多态的原理 三、多态的相关问题 1、指针偏移问题 2、输出的程序是什么&#xff1f; 3、输出的程序是什么&#xff1f; 【前言】 上一篇我们学习了多态的基础知识&#xff0c;这一篇我将带着大…