PBR经典光照模型

传统经验光照模型

引入:

光照模型:illumination model、明暗模型,用于计算物体某一点上的光照强度(是一个颜色值)。
光照模型通常分为以下两种:基于日常人眼观察的经验模型,即“看起来对”模型和基于物理理论的光照模型,即physical based render model,PBR模型。

经验光照模型 & 基于物理的光照模型
1、经验光照模型:对光照的一种模拟,通过人眼实践总结出简化现实场景中复杂的光照,简化了计算过程,并能够达到不错的表现效果。
2、基于物理的光照模型:偏重于物理的度量和统计方法,基于物理公式的模型,实现效果非常逼真,同时计算量大,计算复杂。

(下图左1是基于物理的光照模型,其余均是经验模型)
在这里插入图片描述
现实世界的光照极其复杂,为了在计算力有限的计算机上模拟光照,我们会将复杂的光照进行简化,一方面是为了在使计算处理更简单的情况下,使模拟效果更符合我们的需求,同时也降低了学习成本。这些光照模型就是我们对光的物理特性的理解和重现。

(下图的光照模型的发展)
在这里插入图片描述

一、 局部光照模型

定义:

只关心直接光照,即只关心在光源–>物体–>人眼的过程中,没有被其他物体反射过的,直接进入摄像头和人眼的光线。

(下图中的光线没有被其余物体反射,只有主物体对其反射,即直接光照)
在这里插入图片描述
(下图中有的光线在进入人眼前被多次反射,除了主物体的反射,还被场景中其他物体反射)
在这里插入图片描述

组成:

局部光照模型由以下四部分组成,满足叠加原理。
1、漫反射
2、高光反射(镜面反射)
3、环境光
4、自发光

漫反射:
在光照模型的定义中,当光线从光源照射到模型表面时,光线均匀被反射到各个方向,这种现象就是漫反射。
在漫反射的过程中,光线发生了发生了吸收和散射,而因此改变颜色和方向。

在这里插入图片描述

漫反射公式:反射光强度与法线和光源方向之间的夹角的cos值成正比。
= 光颜色 * 漫反射材质 * 漫反射光强(点乘结果)

(看看就行)理论基础:
在光学中通常使用辐射度来量化光。
其中光源每秒发出的能量为辐射通量P单位面积接受的光量为辐射通量密度(辐照度)P/A当光源垂直照射的单位面积的辐照度为E1=P/A1
将光束以某个角度照射到更大的平面上的辐射度为E2=P/A2
可以认为A1与A2的关系是	

在这里插入图片描述

高光反射(镜面反射):
当光线到达物体表面并发生了反射,观察视线在反射光线的附近时,便能够观察到了高光反射。
高光反射描述了光线与物体表面发生的反射(光强不变,方向改变)。
高光反射的反射率是根据一种菲涅尔效应的物理现象决定。
通常使用对应的反射贴图描述物体表面的反射率,并且使用光泽度(粗糙度,反光度)描述高光范围的大小。

镜面反射公式:
在这里插入图片描述
在这里插入图片描述

m_gloss表示材质的光泽度(gloss是m的下标-_-#) m_specular表示材质的反射光 r表示反射光线 v表示视线向量
Gloss(光泽度)影响了物体表面发生高光反射的面积

在这里插入图片描述
在这里插入图片描述

环境光:
在局部光照模型中,由于没有考虑间接光照的影响,因此为了处理这种间接光照,为光照模型引入环境光

(下图为有无环境光的对比,左图为没有)在这里插入图片描述

环境光公式:

在这里插入图片描述

通常使用漫反射的反照率来指示环境光照的反射光量该模型假定场景中发生多次散射和反射,并在所有方向上均等的射向目标物体。

自发光:
顾名思义,物体自身发射的光线,通常作为单独的一项加入光照模型一般使用一张发光贴图描述物体的自发光

在这里插入图片描述

局部光照模型的合成

在这里插入图片描述

通过对四个部分的不同的调整或使用不同的纹理贴图就可以得到完全不一样的表现效果

二、经典光照模型

Lambert模型

光照公式=漫反射公式:
在这里插入图片描述

特点:无法提供高光效果,呈现效果偏向橡胶

代码部分:

float4 frag(VertexOutput i) : COLOR {
                float3 nDir = i.nDirWS;
                float3 lDir = _WorldSpaceLightPos0.xyz;
                float nDotl = dot(i.nDirWS,lDir);
                //自定义光颜色_lightColor和漫反射材质_diffuse
                float3 Lambert = _lightColor.rgb * _diffuse.rgb * max(0.0,nDotl);
                return float4(Lambert,1.0);
            }

Phone模型

在这里插入图片描述

特点如上图

按局部光照模型需要:环境光+漫反射光+高光+自发光(可选择)
环境光 = 漫反射材质 * 环境光颜色;
漫反射 = 直接光颜色 * 漫反射材质 * 漫反射光的强度;
高光 = 直接光颜色 * 高光材质 * 高光强度;

代码部分

fixed4 frag (v2f i) : SV_Target
            {
                float3 nDir = i.nDirWS;
                float3 lDir = _WorldSpaceLightPos0.xyz;
                float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
                float3 rDir = reflect(-lDir, nDir);
            //DIFFUSE
                float3 ndotl = dot (nDir, lDir);
                float3 diffuse = _Diffuse * _LightColor0.rgb * max(0.0,ndotl);
            //SPECULAR
                float3 vdotr = dot(vDir, rDir);
                float3 specular = _Specular * _LightColor0.rgb * pow(max(0.0, vdotr), _gloss);
            //AMBIENT
                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * _Diffuse;
            //finalColor
                float3 finalCol = diffuse + specular + ambient;

效果(没有mainColor,只有_LightColor0.rgb)
在这里插入图片描述

Blinn-Phone模型

在这里插入图片描述

其一:可见blinn-phong 与 phong的不同之处在于高光的点乘部分。改进之处在于使用vDir(视方向)与rDir(反射光方向)的半程向量hDir ,hDir再与nDir(法线方向)点乘,由于运算简单,不用使用reflect()函数,而是直接vDir + rDir相加,简化了计算调高了效率·。

其二:当光源与视线都在物体表面之上时,半角向量与法线的角度永远不大于90度。
设想一种情况,当材质的反光度非常低,因此物体的被光线照射的大部分区域都会发生高光反射。这些区域中一部分高光部分的反射向量与视线的夹角超过了90度。如果使用Phone模型就会导致高光区域一部分发生缺失。(因为使用了max()将小于0部分约束到了0)这是由于phone模型只考虑视线与光照分布在法线两侧的情况。当视线与光照在法线同侧时且高光反射对亮度有较大影响时,就会发生断层。

Flat模型

在这里插入图片描述

LowPoly选他就对了

我自己的光照模型(视频)
视频截图
在这里插入图片描述
光照模型中的能量守恒:
双向反射分布函数(bidirectional reflectance distribution function,BRDF)就是研究入射光线能量与出射光线能量比值的函数,它表示入射光的辐射度与反射光的辐射率的比值
在这里插入图片描述
BRDF是两个重要性质:

Helmholtz互异性 & 能量守恒
其中能量守恒:
在这里插入图片描述
双向反射函数又可以分为漫反射分量和镜面反射分量:
在这里插入图片描述
其中s+d =1,即漫反射,镜面反射和热量散失的能量和=光打到表面上的能量。specular多diffuse就弱,反之亦然。
fd可以是lambert模型,fs可以是blinn-phong模型,无论是什么,两者的和都是<=1的。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值