目录
课时73:FragmengShader-法线纹理和凹凸贴图1
课时74:FragmengShader-法线纹理和凹凸贴图2
又间隔了一个星期,学习了一下Lumion,作为用Unity做三维可视化的,一直听过,这次趁机学习了一下,只能说不能直接给Unity用,仅仅是对建模人员出渲染效果图帮助很大。
课时73:FragmengShader-法线纹理和凹凸贴图1
凹凸映射
法线数据怎么存储
法线贴图中存储的是高度值0-1。
蓝灰色。
课时74:FragmengShader-法线纹理和凹凸贴图2
过度,相邻位置的高度差,做为灰度值。
差分向量的叉积,
‘脚本:根据灰度值创建法线贴图。
using UnityEngine;
public class CreateNormalMap : MonoBehaviour
{
public Texture2D tex0;
public Texture2D tex1;
public int width = 256;
public int height = 256;
// Start is called before the first frame update
void Start()
{
for(int h=1;h< height-1; h++)
{
for(int w = 1; w < width - 1; w++)
{
float uleft = tex0.GetPixel(w-1, h).r;//灰度图,rgb相等,取一个就行
float uright = tex0.GetPixel(w + 1, h).r;
float u = uright - uleft;
float vtop= tex0.GetPixel(w, h-1).r;
float vbottom = tex0.GetPixel(w, h + 1).r;
float v = vbottom - vtop;
//深度信息,z分量
Vector3 vector_u = new Vector3(1, 0, u);//x轴
Vector3 vector_v = new Vector3(0, 1, v);//y轴
Vector3 N = Vector3.Cross(vector_u, vector_v).normalized;//叉积,法向量
float r = N.x * 0.5f + 0.5f;//(-1,1)->(0,1)
float g= N.y * 0.5f + 0.5f;
float b= N.z * 0.5f + 0.5f;
tex1.SetPixel(w, h, new Color(r, g, b));
}
}
tex1.Apply(false);
}
}
也就是unity那个创建法线贴图的内部算法。
都是黑色时的蓝紫色是(128,128,255),都是白色时的也是(128,128,255),也就是说,灰度值和法线贴图的内容不是简单的根据一个像素的值确定的,而是和周边点的插值->叉积确定的。