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.rhkb.cn/news/296852.html

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

相关文章

GPT4不限制使用次数了!GPT5即将推出了!

今天登录到ChatGPT Plus账户,出现了如下提示: 已经没有了数量和时间限制的提示。 更改前:每 3 小时限制 40 次(团队计划为 100 次);更改后:可能会应用使用限制。 GPT-4放开限制 身边订阅了Ch…

C++多线程:单例模式与共享数据安全(七)

1、单例设计模式 单例设计模式,使用的频率比较高,整个项目中某个特殊的类对象只能创建一个 并且该类只对外暴露一个public方法用来获得这个对象。 单例设计模式又分懒汉式和饿汉式,同时对于懒汉式在多线程并发的情况下存在线程安全问题 饿汉…

【原创】基于分位数回归的卷积长短期结合注意力机制的神经网络(CNN-QRLSTM-Attention)回归预测的MATLAB实现

基于分位数回归的卷积长短期结合注意力机制的神经网络(CNN-QRLSTM-Attention)是一种用于时间序列数据预测的深度学习模型。该模型结合了卷积神经网络(CNN)、长短期记忆网络(LSTM)和注意力机制(A…

C语言实现通讯录(从0-1的项目)

一、前言 1、实现通讯录首先我们要了解并懂得如何通过C语言来完成有关顺序表的实现 2、需要了解的内容:如何使用顺序表结构实现增、删、改、查等操作 二、顺序表的认识和实现 1、什么是顺序表 最基础的数据结构就是数组。 顺序表则是线性表的一种,…

图片改大小尺寸怎么改?几个修改图片尺寸的方法

日常生活和工作中,图片的大小和尺寸对于我们的工作和生活都至关重要,因此我们经常需要调整图片的大小。我们都知道压缩图是一款功能强大的图片在线处理工具,那么用它怎么调整图片大小呢?下面就让我们一起来看一下具体的操作步骤。…

基于Spring Boot的在线考试系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…

实时渲染 -- 材质(Materials)

一、自然界中的材质 首先了解下自然界中的材质 如上这幅图,不同的物体、场景、组合,会让我们看到不同的效果。 我们通常认为物体由其表面定义,表面是物体和其他物体或周围介质之间的边界面。但是物体内部的材质也会影响光照效果。我们目前只…

微服务(基础篇-008-es、kibana安装)

目录 05-初识ES-安装es_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p81&vd_source60a35a11f813c6dff0b76089e5e138cc 1.部署单点es 1.1.创建网络 1.2.加载镜像 1.3.运行 2.部署kibana 2.1.部署 2.2.DevTools 3.安装IK分词器 3.1.在线安装ik…

【IP组播】PIM-SM的RP、RPF校验

目录 一:PIM-SM的RP 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-SM和静态RP 4.配置动态RP 5.配置Anycast RP 二: RPF校验 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-DM 4.RPF校…

【洛谷 P8695】[蓝桥杯 2019 国 AC] 轨道炮 题解(映射+模拟+暴力枚举+桶排序)

[蓝桥杯 2019 国 AC] 轨道炮 题目描述 小明在玩一款战争游戏。地图上一共有 N N N 个敌方单位,可以看作 2D 平面上的点。其中第 i i i 个单位在 0 0 0 时刻的位置是 ( X i , Y i ) (X_i, Y_i) (Xi​,Yi​),方向是 D i D_i Di​ (上下左右之一, 用…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

股权激励和期权激励对比辨析

文章目录 概念定义 收益方式 风险评估 应用和分析 股权激励和期权激励,两者的区别是什么,本文就来梳理对比一下。 概念定义 股权激励,是指上市公司以本公司股票为标的,对其董事、高级管理人员及其他员工进行的长期性激励。取得…

JVM专题——类文件加载

本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-loading-process.html 🚀 基础(上) → 🚀 基础(中) → 🚀基础(下&a…

C++从入门到精通——入门知识

1. C关键字(C98) C总计63个关键字,C语言32个关键字 2. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名…

ST表---算法

相当于二分的思想,一直比较最值 ST的创建 现在创建成功,是应该如何查询的问题 ST表的查询 虽然这两区间有重叠,但是可以一个往前数,一个往后数,互不影响 时间复杂度 创建st表的复杂度为n*logn 使用时的复杂度为O(…

【机器学习】K-近邻算法(KNN)介绍、应用及文本分类实现

一、引言 1.1 K-近邻算法(KNN)的基本概念 K-近邻算法(K-Nearest Neighbors,简称KNN)是一种基于实例的学习算法,它利用训练数据集中与待分类样本最相似的K个样本的类别来判断待分类样本所属的类别。KNN算法…

Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表 Golang哈希表的实现,底层数据结构是数组单链表,链表节点由8个key、value和键的高八位组成的。为了方便理解,先简单看一个图快速理解。 我们来看一下Golang哈希表的结构体定义 简单介绍一下结构体中几个关键的…

.NET CORE 分布式事务(四) CAP实现最终一致性

目录 引言: 1.0 最终一致性介绍 2.0 CAP 2.0 架构预览 3.0 .NET CORE 结合CAP实现最终一致性分布式事务 3.1 准备工作(数据库,本文使用的是MySql) 3.1.1 数据模型 3.1.2 DbContext 3.1.3 数据库最终生成 3.2 Nuget引入 3.3 appsettings.json …

【漏洞复现】极简云 download.php 接口处存在任意文件读取漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

OpenHarmony实战:小型系统平台驱动移植

在这一步,我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构: device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …