Wallen's Note

There is no audience.

  • Lambert光照模型

    概念

    Lambertian反射定义了一个理想的无光表面或者漫反射表面。无论观察者的视角如何,Lambertian表面对观察者表现的亮度都是相同的。

    也就是说, 表面的亮度是各向同性的,并且发光强度遵循Lambert的余弦定律。

    在计算机图形学中,Lambertian反射一般被用于漫反射模型。

    公式

    I_d=L \cdot N C I_L

    其中:

    • I_d:表面的漫反射强度
    • L:表面指向光源的向量(归一化)
    • N:表面的法线向量方向(归一化)
    • C:表面颜色
    • I_L:入射光的强度(也即光的RGB)

    根据公式可以看出反射的强度跟视角无关,跟法线和光源方向的夹角的余弦值(即L \cdot N)成正比。

    NL之间的夹角超过90度也就是在背光的一面,L \cdot N的结果会小于零,这种情况下一般直接取0(即max(0,L \cdot N)),所以看起来会比较平。Valve公司在开发Half Life时,对Lambert模型做了简单的修改,以避免这种问题的发生:

    变种:Half Lambert

    Half-Life中首先使用的技术,对Lambert模型进行了简单的修改,避免物体的背光面看起来太平。方式是将max(0,L \cdot N)改为0.5(L \cdot N)+0.5,即将点积的结果由[-1,1]变为[0,1]

    To soften the diffuse contribution from local lights, the dot product from the Lambertian model is scaled by ½, add ½ and squared.

    Value官方对Half Lambert的解释中好像还说了要平方,但网上的各种实现都没有这一步,不知道是不是理解错了squared的意思。如果不平方,Half Lambert要比Lambert亮很多,平方之后就比较接近了:

    法线方向和光源方向的夹角从0到π变化时,三种情况的曲线,黑色Lambert,红色Half Lambert,绿色Half Lambert Squared:

  • Phong光照模型

    概念

    Phong模型是一种局部光照的经验模型。由犹他大学的美国越南裔学者Bui Tuong Phong在其1975年的博士论文中提出。

    Phong模型认为物体表面反射光线由三部分组成:

    • 环境光(Ambient):场景中的其他间接光照
    • 漫反射(Diffuse):散射部分(大但不光亮)
    • 高光反射(Specular):镜面反射部分(小而亮)

    img

    (在上图中,光线是白色的,环境光和漫反射部分是蓝色的,高光部分是白色的。)

    可以看到,高光部分反射的光区域比较小,但强度很大;漫反射部分的强度根据物体表面方向的不同而不同;而环境光部分是跟方向无关的。

    (更多…)

  • Humanoid动作使用Root Motion要注意的问题

    我们游戏内的动作都是Generic类型的,并且技能动作使用了{% post_link Unity-Root-Motion Root Motion %}来处理技能位移。

    所有模型都有一跟B_Root骨骼(没有蒙皮信息),用作模型导入设置里的Root node。

    如果将动作类型改为Humanoid,则由于B_Root的存在,会导致Root Motion无法正常使用,不管Bake Inot Pos与否,动作本身都会有位移,看表现应该是B_Root影响到了Body Transform和Body Orientation的计算:

    (更多…)

  • FBX从3ds Max到Unity

    3ds Max导出FBX

    导出模型

    1. 选择模型、所有具有蒙皮信息的骨骼、B_Root,如下:

    (更多…)

  • 简单实用的双开Unity技巧

    工欲善其事,必先利其器

    在使用Unity开发游戏的过程中经常需要同时启动两个甚至多个Unity客户端来进行测试或调试,最简单的做法自然是checkout两份工程。

    但会遇到一些问题:

    • 每次开第二个工程Unity就会先报错,然后让你选择工程,虽说无关痛痒,但次数多了也容易让人烦躁:

    • 任务栏上的Unity图标很容易忘记哪个对应哪个工程
    • 用VS进行debug的时候不知道应该挂到哪个进程上,这是最烦的

    当然这些令人不爽的问题都是可以解决的,下面是我的做法:

    (更多…)