凹凸映射
主要分为高度纹理和法线纹理:
高度纹理:存储的是强度值(intensity) 颜色浅的地方的表面越往外凸起 颜色深的地方越往里凹 该方法非常直观 但是计算更加复杂
法线纹理:法线纹理存储的是法线方向 由于法线的分量范围在[-1,1] 而像素的分量范围在[0,1] 因此我们需要做一个映射
一般使
用的是
pixel = (normal +1) /2 因此在shader对纹理采样后 还需要对结果进行一次反映射 得到原来的法线方向 normal = pixel * 2-1
简单来说,模型空间来存储法线的优点:实现起来简单,直观。可以提供平滑的边界。
使用切线空间的优点更多:自由度高。可以实现UV贴图。重用性高。可以压缩
切线空间下进行光照计算:
效果图:
Shader "NormalMapTangentSpace"
{
Properties{
_Color("Color Tint",Color) = (1,1,1,1)
_MainTex("Main Tex",2D)= "White"{}
_BumpMap("Normal Map",2D)="bump"{} //bump是Unity自带的法线纹理
_BumpScale("Bump Scale",float) = 1.0//用于控制凹凸程度 当BumpScale=0时,表示该纹理对光照无影响
_Specular("Specular",Color )= (1,1,1,1)
_Gloss("Gloss",Range(8.0,256)) = 20
}
SubShader{
pass{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"