欢迎光临散文网 会员登陆 & 注册

URP | Phong 和 Blinn-Phong光照光照模型

2021-11-27 15:51 作者:那个人真狗  | 我要投稿

Phong | 冯氏光照模型

介绍

Phong光照模型中主要的部分就是对高光的计算

是根据反射原理,如果正好在反射方向观察,那看到的反射光就越多。所以计算反射方向和观察方向。就可以计算出高光反射。

公式

  • I(spcular) = pow(max(0,dot(R,V)), gloss)

  • 最终颜色 = 直射光颜色 * 反射光颜色 * pow(max(0, dot(反射光方向, 视野方向)), 光泽度(gloss)

Phong光照模型原理

  • 简单介绍一下,兰伯特光照模型,已经获取到了法线向量(N),光照向量(L),

    Phong 光照模型 是计算观察方向(V)和反射方向(R) 这俩个向量。计算出高光的强弱。

  • HLSL 怎么求出这俩个向量,



  • V 视角

  • 获取相机的世界坐标(_WorldSpaceCameraPos )这个宏是内置的,

  • 使用相机空间的位置信息 —世界空间顶点位置信息 = 就可以得到相机方向。

  • 这一步是在顶点阶段计算的,不要忘记片元结构体里申明变量。


注意 :是float3类型的向量,不要错误。

在片元着色器阶段计算

  • 片元着色器

  • 传入数据归一化一下,

    注意 :是float3类型的向量,不要错误。

R 反射

  • 那怎么计算反射向量,我们可以使用光的反方向,和顶点法线方向求出反射方向。

注意 :是float3类型的向量,不要错误。

这里的 -LightDir 是负的方向。


高光计算部分

  • 套用公式带入,后面 乘光照颜色。


  • 效果

代码

Blinn-Phong光照

半角向量 | Halfway vector

  • Blinn-Phong光照引入了一个概念,半角向量,用H表示. 它在视线方向和光线方向的中间

H 半角向量

  • 怎么获取半角向量,使用视角 + 光照方向

  • 高光计算

    使用 dot(N,H)

  • 俩个效果对比

总结

  • Phong 光照模型 主要是计算出 视角方向(ViewDir)和反射方向(ReflectDir),视角方向最好在顶点阶段计算,这样会少很多计算量,向量传入片元着色器阶段归一化一下。

  • 注意:向量的类型,一开始我是设置 real 类型,在反射方向,计算出一个错误的结果。查找了半天。

  • 我们修改成 real3类型,在看一下效果。

  • Blinn-Phone  光照模型,是在Phone基础上修改的,

    Blinn-Phong着色的一个附加好处是,它比Phong着色性能更高,因为我们不必计算更加复杂的反射向量


URP | Phong 和 Blinn-Phong光照光照模型的评论 (共 条)

分享到微博请遵守国家法律