博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 聚光灯
阅读量:4086 次
发布时间:2019-05-25

本文共 791 字,大约阅读时间需要 2 分钟。

聚光灯

1. 什么是聚光灯?

在现实生活中,最常见的聚光灯是手电筒。本质上,聚光灯由一个位置Q、一个方向向量d和一个圆锥体光照区域来描述(参见下图)。

这里写图片描述
(聚光灯由一个位置Q、一个方向向量d和一个半角角度为ϕmax的圆锥体照区域来描述。)

当实现一个聚光灯时,我们开始所做的事情与点光相同。光照向量可以由以下公式描述: 其中,P是接收照的点的位置,Q是聚光灯的位置。从图中可以看到,当且仅当, −L与d之间的角度ϕ小于圆锥角ϕmax时,P在聚光灯的锥形范围内(所以它可以接收光照)。另外,在聚光灯的圆锥体区域中的线应该具有不同的强度;越靠近圆锥体中心的光线应该越强,随着角度ϕ从0增加到ϕmax,光线强度应该逐渐衰退为0(零)。

2. 如何通过一个ϕ的函数来控制衰减强度,以及如何控制聚光灯的圆锥体区域大小?

其实很简单,我们只需要故伎重演,直接套用控制镜面高光圆锥体反射系数的公式即可。也就是,使用如下函数:

这里写图片描述

回顾下图所示的使用不同幂时的余弦函数曲线。

这里写图片描述

我们可以看到,当ϕ增加时,强度逐渐衰减,这是我们想要得到的结果;另外,通过修改指数s,我们可以间接地控制ϕmax(它是当光照强度降低为0时的圆锥体角度);也就是说,我们可以通过改变s来缩小或扩大聚光灯的圆锥体区域大小。例如,当我们将s设为8时,圆锥体的半角角度约为45º。这样,聚光灯与点光的方程基本相同,只是要再乘以一个聚光灯因子,根据点与聚光灯圆锥体的相对位置按比例调整光照强度:

这里写图片描述

注意:比较聚光灯公式和点光公式,我们可以看出聚光灯比点光耗费的资源要高得多,这是因为我们需要计算kspot因子。同理,比较点光公式和平行光公司,我们可以看出点光比平行光耗费的资源要高得多,这是因为需要计算距离d(这个计算涉及到平方根运算,非常耗时),而且需要除以衰减表达式。总而言之,从资源耗费角度而言,平行光要求最低,点光其次,聚光灯最高。

你可能感兴趣的文章
MODULE_DEVICE_TABLE的理解
查看>>
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
查看>>
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>
新版本的linux如何生成xorg.conf
查看>>
Linux基础教程:CentOS卸载KDE桌面
查看>>
read humor_campus
查看>>
my read work
查看>>
db db2 base / instance database tablespace container
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
webServer kzserver/1.0.0
查看>>
OS + Linux DNS Server Bind
查看>>
linux下安装django
查看>>
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
查看>>
Android开发中Button按钮绑定监听器的方式完全解析
查看>>