在当今的游戏开发可编程管线中,我们最常使用的一种贴图方式就是法线贴图。使用法线贴图我们可以在低分辨率的模型上实现一种模拟高分辨率效果。因为不同于对每个顶点(逐顶点级)进行光照计算,我们是将法线贴图中的各像素点作为模型的法线,这样我们的光照呈现高分辨率的效果,同时模型保持低多边形数。
在三维计算机图形学中,法线贴图也叫"DOT3(仿立体)凹凸映射",是一种用于模拟凸起和凹陷的光照效果——凹凸贴图的实现技术。它是用来在不增加额外多边形的情况下添加更多细节。该技术的一个常见用途是通过一个高多边形模型或高度图形成法线贴图,这样就显著地提高了低多边形模型的表现效果以及细节。
法线贴图通常存储在一个普通的RGB图片,它的RGB分量分别对应了曲面法线的X,Y,Z坐标。
一、创建shader
Shader "Custom/NormalMap" {
Properties {
_MainTint ("Diffuse Tint", Color) = (1,1,1,1)
_NormalTex ("Normal Map", 2D) = "white" {}
_NormalIntensity ("Normal Map Intensity", Range(0, 2)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _NormalTex;
float4 _MainTint;
float _NormalIntensity;
struct Input {
float2 uv_NormalTex;
};
void surf (Input IN, inout SurfaceOutput o) {
//UnpackNormal():返回法线,将法线贴图中的各个像素点作为模型的法线
float3 normalMap = UnpackNormal(tex2D (_NormalTex, IN.uv_NormalTex));
//通过_NormalIntensity调整法线贴图的强度
normalMap = float3(normalMap.x * _NormalIntensity, normalMap.y * _NormalIntensity, normalMap.z);
o.Normal = normalMap.rgb;//法线值
o.Albedo = 1.0;//反射率
o.Alpha = 1.0;//透明度
}
ENDCG
}
FallBack "Diffuse"
}
二、创建Material和Sphere
运行效果: 不同法线贴图强度