一、法线纹理的作用
- 增加细节表现
- 模拟复杂表面:法线纹理能够在不改变模型几何形状的基础上,大幅增加模型表面细节的丰富程度。例如,在游戏场景中,对于一个低多边形的墙面模型,通过应用法线纹理,可以模拟出石头墙面的凹凸不平、砖块的纹理以及裂缝等细节。这使得模型看起来更加真实,仿佛拥有更高的几何复杂度。
- 精细纹理模拟:除了模拟凹凸效果,法线纹理还可以用于模拟一些精细的表面纹理,如布料的褶皱、木材的纹理方向和金属表面的微小划痕等。这些细节如果通过增加几何模型的多边形数量来实现,会消耗大量的计算资源和存储空间。而法线纹理提供了一种高效的方式来模拟这些细节,使模型在视觉上更加逼真。
- 优化性能
- 减少几何复杂度:由于法线纹理可以模拟表面细节而无需增加实际的几何形状,因此可以显著减少模型的多边形数量。在实时渲染应用中,如游戏开发和虚拟现实场景中,减少多边形数量可以降低图形处理单元(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