首页 > 其他分享 >法线纹理知识

法线纹理知识

时间:2024-12-17 20:27:54浏览次数:10  
标签:法线 切线 模型 知识 纹理 空间 向量

一、法线纹理的作用

  1. 增加细节表现
    • 模拟复杂表面:法线纹理能够在不改变模型几何形状的基础上,大幅增加模型表面细节的丰富程度。例如,在游戏场景中,对于一个低多边形的墙面模型,通过应用法线纹理,可以模拟出石头墙面的凹凸不平、砖块的纹理以及裂缝等细节。这使得模型看起来更加真实,仿佛拥有更高的几何复杂度。
    • 精细纹理模拟:除了模拟凹凸效果,法线纹理还可以用于模拟一些精细的表面纹理,如布料的褶皱、木材的纹理方向和金属表面的微小划痕等。这些细节如果通过增加几何模型的多边形数量来实现,会消耗大量的计算资源和存储空间。而法线纹理提供了一种高效的方式来模拟这些细节,使模型在视觉上更加逼真。
  2. 优化性能
    • 减少几何复杂度:由于法线纹理可以模拟表面细节而无需增加实际的几何形状,因此可以显著减少模型的多边形数量。在实时渲染应用中,如游戏开发和虚拟现实场景中,减少多边形数量可以降低图形处理单元(GPU)的计算负担,提高渲染帧率。例如,一个复杂的角色模型如果不使用法线纹理,可能需要数百万个多边形来表现皮肤的褶皱、衣服的纹理等细节。而使用法线纹理后,可以将多边形数量降低到一个合理的范围,同时保持相似的视觉效果。
    • 高效的资源利用:相比于创建高多边形的复杂模型,使用法线纹理可以更有效地利用存储空间和内存。法线纹理通常占用的存储空间相对较小,而且可以通过压缩技术进一步减小其大小。同时,在渲染过程中,处理法线纹理的计算成本也相对较低,使得在有限的硬件资源下能够渲染出更丰富的场景。

二、法线纹理中存储的信息

1.法线向量信息

  • 法线纹理(Normal Map)是一种特殊的纹理,它存储的不是颜色信息,而是每个纹理像素点对应的法线向量信息,所以法线贴图中存储的是切线空间下的法线向量信息
  • 法线向量是一个三维向量,通常在切线空间(Tangent Space)中定义在切线空间中,法线向量的x、y、z分量分别表示相对于切线(Tangent)、副切线(Bitangent)和法线(Normal)方向的偏移。
  • 传统的模型表面法线是基于模型的几何形状计算出来的,是固定的。而法线纹理允许在不改变模型几何形状的基础上,通过纹理来模拟表面的细节和凹凸。例如,一个低多边形的平面模型,通过应用法线纹理,可以模拟出石头表面的凹凸不平或者布料的褶皱等复杂的表面细节。

2.空间坐标系信息 

  • 基于切线空间的局部坐标系信息:法线纹理通常基于切线空间来存储法线方向。对于模型的每个顶点,都有一个对应的切线空间,其中 z 轴是顶点的法线方向,x 轴是顶点的切线方向,y 轴可由法线和切线叉积得到,即副切线或副法线方向。
  • 与其他空间的转换关系信息:虽然法线纹理存储的是切线空间下的法线信息,但在实际渲染计算中,往往需要将其转换到世界空间或模型空间等其他坐标系下进行光照计算等操作,因此其存储的信息也隐式地包含了与这些空间的转换关系。

在法线贴图中用RGB颜色值来存储法线向量的信息

而法线向量的分量x、y、z的范围在 (-1,1),而颜色值的分量范围为(0,1),所以在存储时需要进行相应的转换:【xyz*1/2+1/2】

三、切线空间

  • 切线空间是一个基于模型表面的局部三维坐标系它是围绕模型表面的每个顶点构建的,用于描述该顶点附近的表面方向特性。这个空间由三个相互垂直的向量定义:切线向量(TANGENT)、副切线向量(BINORMAL)和法线向量(NORMAL)。
  • 法线向量垂直于模型表面,它指向模型表面的外部(对于封闭的物体)。切线向量通常是沿着模型表面纹理坐标的 U 方向,而副切线向量是通过法线向量和切线向量的叉积计算得到的,它与切线向量和法线向量都垂直,并且方向遵循右手定则。在右手坐标系中,当拇指指向法线方向,食指指向切线方向时,中指就指向副切线方向。

四、在进行光照计算时需要将各种值都统一到一个空间中计算

1.可以将基于切线空间下的法线信息转换到世界空间下

  • 在渲染场景时,光照计算通常是在世界空间或观察空间中进行的光照方向是在世界空间中定义的,如果法线仍在切线空间,就无法直接与光照方向进行点积等运算来确定光照强度。(例如,计算漫反射光照时,漫反射光强是与法线和光照方向的夹角余弦值成正比的。只有将法线转换到世界空间,才能和世界空间中的光照方向进行正确的运算,得到符合物理规律的光照效果)
  • 除了光照方向,还有视角方向(从观察点指向物体表面的方向)等向量在世界空间或观察空间中定义。在计算高光反射等光照效果时,需要将法线与这些向量在同一空间下进行运算。(例如,在 Phong 高光反射模型中,需要计算反射光方向(基于法线和光照方向),然后与视角方向进行点积,如果法线不在世界空间,就很难准确地计算这些向量之间的关系)

五、如何将切线空间下的法线信息转换到世界空间下?

1.先构建切线空间变换矩阵(位于顶点着色器)

切线空间变换矩阵是由切线向量(TANGENT)、副切线向量(BINORMAL)和法线向量(NORMAL)组成的

  • 假设在顶点着色器中,我们有一个模型的顶点属性包括切线向量 tangent、法线向量 normal。副切线向量可以通过叉积计算得到,即 binormal = cross(normal, tangent)。不过要注意叉积的顺序,以确保得到正确的右手坐标系。

2.在片元着色器中利用切线空间变换矩阵将法线纹理中读取的法线信息进行转换

  • 在片元着色器中,从法线纹理中读取的法线信息是在切线空间下的。假设读取的法线信息存储在变量 normalInTangentSpace 中,通过与之前构建的 TBN 矩阵相乘,就可以将法线信息转换到世界空间。
  • 转换公式为:normalInWorldSpace = TBN * normalInTangentSpace。这里的乘法是矩阵与向量的乘法。

六、在Shader中实现将法线信息转换到世界空间下并实现光照计算

Shader"unity/Texture02"
{
	Properties
	{
		//定义法线纹理  [Normal]标签的作用是使得该纹理贴图的位置只能装载法线贴图
		[Normal]_NormalTex("NormalTex",2D)="white"{}
	 }

	SubShader
	{
		Pass
		{
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

			sampler2D _NormalTex;
			float4 _NormalTex_ST;

			struct appdate
			{
				float4 vertex:POSITION;
				float2 uv:TEXCOORD;
				float3 normal:NORMAL;
				//(tangent四维向量,xyz代表坐标,w代表切线的方向)
				float4 tangent:TANGENT;
			 };

			struct v2f
			{
				float4 pos:SV_POSITION;
				float2 uv:TEXCOORD;
				//定义切线空间变换矩阵
				float3 tSpace0:TEXCOORD1;
				float3 tSpace1:TEXCOORD2;
				float3 tSpace2:TEXCOORD3;
			 };

			v2f vert(appdate v)
			{
				v2f o;
				o.uv=TRANSFORM_TEX(v.uv,_NormalTex);
				o.pos=UnityObjectToClipPos(v.vertex);

				//世界空间法线
				float3 worldNormal=UnityObjectToWorldNormal(v.normal);

				//将模型顶点的切线由本地空间转换为世界空间
				float3 worldTangent=UnityObjectToWorldDir(v.tangent);

				//决定切线的方向
				float tangentSign=v.tangent.w*unity_WorldTransformParams.w;

				//副切线由切线向量和法线向量的叉积所得
				float3 worldBinormal=cross(worldNormal,worldTangent)*tangentSign;

				//给切线空间变换矩阵赋值
				o.tSpace0=float3(worldTangent.x,worldBinormal.x,worldNormal.x);
				o.tSpace1=float3(worldTangent.y,worldBinormal.y,worldNormal.y);
				o.tSpace2=float3(worldTangent.z,worldBinormal.z,worldNormal.z);

				return o;
			 }

			float4 frag(v2f i):SV_TARGET
			{	
				//法线纹理的采样(切线空间下的法线值)//采样法线贴图后的值为一个三维向量
				fixed3 normalTex=UnpackNormal(tex2D(_NormalTex,i.uv));

				//worldN是基于切线变换矩阵和切线空间下的法线值所计算得到的世界空间下的法线值
				fixed3 worldN=float3(dot(normalTex,i.tSpace0),dot(normalTex,i.tSpace1),dot(normalTex,i.tSpace2));

				fixed3 L=normalize(_WorldSpaceLightPos0);

				//lamber光照模型 max(0,dot(N,L)
				fixed NdotL=max(0,dot(worldN,L));

				return NdotL;
			 }

			ENDCG
		 }
	 }
 }

标签:法线,切线,模型,知识,纹理,空间,向量
From: https://blog.csdn.net/2401_83878847/article/details/144541483

相关文章

  • 极限的定义与求解(微积分前置知识)
    文章目录说明第3章极限导论3.1~43.5关于渐近线的两个常见误解3.6三明治定理第4章求解多项式的极限问题4.1x→a......
  • 【大模型智能客服背景下】知识图谱笔记
     【背景】        在数字化飞速发展的时代,客户服务的质量和效率成为企业立足市场、赢得客户信赖的关键因素之一。随着人工智能技术的不断革新,智能客服应运而生,为企业与客户之间搭建起了更为便捷、高效的沟通桥梁。        传统的智能客服系统往往基于预设规......
  • 【教程】第八章:知识库——学海无涯
    8.1欢迎来到新的一章在本章中,我们将深入学习如何构建一个知识库。这将是一个综合性的模块,帮助我们管理和组织文档、任务和信息。通过设计和创建一个树形结构的文档表,我们将实现对文档的状态、附件和关联任务的高效管理。8.2数据库设计初探8.2.1基础设计与文档表的创建首先,......
  • 【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节
    现象在yasql执行sql语句后报错:YASQL-00021inputlineoverflow(>4000byteatline4)原因yasql在交互模式模式下单行字符总量限制4000字节,超出该限制即报错。交互式模式下,yasql会显示一个提示符,通常是SQL>,等待用户输入命令,用户执行的每个命令都会立即执行,并显示结果。......
  • 【YashanDB知识库】YCP单机部署离线升级-rpc升级方式详细步骤
    前提:每个被纳管的主机必须开放9072端口1、先执行备份操作#ycm安装路径为默认/opt/ycmcd/opt/ycm/ycm/scripts[yashan@ecs-ba94-0001scripts]$sudo./backup.sh-nycm-i/opt/ycm/ycm-cyashandb-y/home/yashan/yasdb_home/yashandb/22.2.11.105--cata-log/home/ya......
  • 【YashanDB知识库】YCP高可用部署离线升级-rpc升级详细步骤
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7686586.html?templateId=1718516以23.2.4.100版本升级到23.2.11.100版本为例升级前先对YCP主备节点执行备份1、主节点执行/opt/ycm/ycm/scripts/backup.sh-nycm-i/opt/ycm/ycm-cyashandb-y/......
  • 【YashanDB知识库】误配置SYSTEM级别的STATISTICS_LEVEL参数为ALL导致数据库性能下降
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7664890.html?templateId=1718516【标题】误配置SYSTEM级别的STATISTICS_LEVEL参数为ALL导致数据库性能下降【问题分类】数据库性能下降【关键字】STATISTICS_LEVEL数据库性能freebufferwait等待......
  • 【YashanDB知识库】用yasldr配置Bulkload模式作单线程迁移300G的业务数据到分布式数据
    问题描述详细版本:YashanDBServerEnterpriseEditionRelease23.2.4.100x86_646db1237影响范围:离线数据迁移场景,影响业务数据入库。外场将部分NewCIS的报表业务放到分布式数据库,验证SQL性能水平。操作系统环境配置:125G内存32CCPU2T的HDD磁盘问题出现的步骤/操作:1、......
  • 国标GB28181软件LiteGBS设备接入知识:录像机怎么配置报警联动录像?
    随着科技的迅猛发展和社会安全需求的不断提升,安防监控行业正迎来前所未有的机遇。智能化、网络化和大数据分析等新技术的应用,使得安防监控系统不仅能够实现实时监控,还能进行智能识别、行为分析和事件预警。设置联动录像后,当触发报警时,系统联动通道录像,并且在报警结束后,根据设置的......
  • 深度学习一些基础知识
    1、过拟合问题1、数据增强对图像进行旋转、翻转、裁剪等操作,创造出更多样的数据样本。2、正则化凡是能解决模型泛化误差而不是训练误差的方法,都被称为正则化。模型的泛化误差主要是由模型过拟合引起的,所以正则化的各种方法用于解决模型过拟合的问题。L1和L2正则化:在损失函数......