【猫猫的Unity Shader之旅】之Phong高光

本文深入探讨Unity中的Phong光照模型,解释了Phong光照方程及其参数,包括入射光颜色、高光反射率、反射光方向和眼睛方向,并介绍了如何获取这些参数。还讨论了环境光和漫反射光照在防止模型过暗中的作用,展示了最终的光照效果。
摘要由CSDN通过智能技术生成

Phong光照方程

  之前我们探讨过一些基于Surface Shader的高光知识,现在我们深入来了解其中的一种光照类型:Phong光照。

  我们知道,高光其实是描述了一种较为理想的情况下,大部分光线都沿着与入射角相等的反射方向照射,也就是说,当我们的眼睛正好在反射方向上时,可以看到大部分光线,当眼睛偏离这个方向时,亮度就会急剧下降,Phong光照就是用来描述这种情况的。Phong光照的光照方程如下:

  Ispecular = Iincomingkspecularmax(0, R·V)nshininess

  其中,Iincoming表示入射光颜色,kspecular表示高光反射率,或者说材料的颜色,因为颜色的产生就是通过反射,R和V分别表示反射光方向和眼睛(view)的方向,通过这两个点乘,就可以得到和重合程度成正比的一个值,再将这个值通过nshininess乘方之后就可以体现出“急剧”这个特点,所以这个nshininess越大,“光点”就会越小。

获取所需参数

  下一步就是如何获得方程所需要的参数。其中Iincoming可以通过Unity为我们传入,kspecular和nshininess通过Shader接口获得,V我们讨论Lambert的时候介绍过,至于R,可以用R = 2N(N·L) - L获得(L是光照方向),推导过程也比较简单,唯一需要注意的是这几个方向都是单位向量,不要认为它们是有长度的。我们也可以不用这种方法,Cg中提供了float3 reflect(float3 I, float3 N)这个方法可以计算反射方向,不过这里的参数I是从光源指向物体表面的,与我们通常说的光照方向正好相反。

  如果只有高光的话,由于强度是急剧下降的,模型的大部分会变黑。为了防止这种情况,我们可以使用环境光来提高一下亮度。环境光用来表示光线经过物体间复杂的相互反射造成原来没有光直射的地方也被照亮的情况,比如白天的时候室内的大部分地方我们都可以看得清的,虽然没有光直接照射它们。环境光需要在Edit->Render Settings里面设置,Shader中使用直接用UNITY_LIGHTMODEL_AMBIENT表示环境光的颜色,也只有颜色这一个信息可以用。此外,我们还可以加入上篇说到的漫反射光照来提高亮度。都加上之后的代码如下:

Shader "Custom/Specular" {
    Properties {
        _Ambient("Ambient Color", Color) = (1, 1, 1, 1</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值