Unity的Shader学习笔记(22)[21/01/22_周五][73-74]

目录

课时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),也就是说,灰度值和法线贴图的内容不是简单的根据一个像素的值确定的,而是和周边点的插值->叉积确定的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值