九、D3D12学习笔记——入射光

我们在场景中处理的对象是像点光源,平行光和聚光灯等类型的光源。光照计算旨在说明入射光线到达观察点P时对P着色的影响,本篇面向的问题就是入射光的获得。

一、衰减问题

光是一种能量,也是一种波,在传播过程中肯定会衰减。这里将衰减定义在两个方向上,一个是光线传播距离方向,一个是光线传播角度方向上(可理解为光向周围发散导致的衰减),因此必将与距离和角度产生联系。

1.基于距离的衰减

我们通常意义上讲,光是一种能量,从光源发出,向四周传播,因此,距离光位置不同,光的耀眼程度不同。假想一下,光不分方向的向一个半球面传播,由于距离不断增大,半球面表面积增大,导致光变暗。根据能量守恒:

I(d)=\frac{I}{2\pi d^{2}}

光源发出的能量均匀分散在半球面上,随着距离平方进行衰减,但是由于平方操作耗性能,我们一般使用线形衰减:

2.基于角度的衰减

就是聚光灯光源能量衰减的一部分:

聚光灯中心点亮度与边缘点是不一样的,因此偏移中心的角度就是其衰减的唯一解释,通常我们根据计算计算点的光向量L与聚光灯中心直射向量d得到角度偏移值求解光照衰减:

  1. 在指数值S中,随着S的增大,Cos数值快速减小,迅速接近于0
  2. 我们不考虑背面光照的情况,使用max限制,因此即使不限制最大角度,根据S指数计算出的数值也会使结果衰减到0,不会产生错误结果(除非你允许背面光照)

比如当S=8,对于45°角会衰减到0.062,这个影响已经很小了。

二、光源分类与细节

光源可大致分为平行光,点光源,聚光灯光源等,细节层面注意以下问题:

1.方向光没有衰减,光源发出光线到观察点P过程,能量不改变;

2.点光源有基于距离的衰减,因此通常要指示起始距离和终止距离;

3.聚光灯光源不仅有基于距离的衰减,还有基于角度的衰减,渲染代价最为昂贵。

三、实现过程注意事项

1.灯光是每帧常量

光照也是每帧更新,通过常量缓冲实现。要注意使用常量缓冲区实现数据传递离不开memcpy进行内存拷贝,由于HLSL进行数据解析过程中是按照内部规则解析字节偏移等,而不是我们自定义,因此,我们上传数据就应该对应其解析过程,所以对于数据组织方式要非常重视:HLSL一般是凑成4D向量,按照4D向量进行打包,凑不成的末尾自动补齐。

 

 比如此处,一个3D向量加一个1D向量刚好可以一起打包,满足HLSL的解析格式,如果按如下方式进行:

不仅占据更大的存储空间,而且打包格式就乱了,我们获取对应数据的时候如果还按照HLSL内置格式,就乱套了,这会增加额外的工作。

2.粗糙度表达

这里边的m涉及我们定义材料的时候要指定一个粗糙度系数r[0-1],表示粗糙程度,那么对应的1-r就是光滑程度,因此:

m=256.0*(1-r)

这只是一个经验公式,对于程序员来说应该是不用考虑他怎么获得,只要知道如何使用就可以了,因为这种数据应该是来自纹理采样,而纹理来自美术人员了。

3.LDR计算

为了获得柔和的LDR(低动态范围)渲染,部分高光渲染结果会超过1,这也是我们在保证光照能量不变时候提出8+m/8系数导致的,我们常对结果进行如下操作:

specColor=\frac{specColor}{1+specColor}

 使结果回到0-1范围内。还有一种方式是直接限制超过1为1,这就会导致不柔和的“一刀切”现象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值