首页 > 其他分享 >光源模型分析

光源模型分析

时间:2023-06-14 19:23:08浏览次数:40  
标签:分析 cos frac 光源 模型 window 点光源 light

一、光源模型概述

     在成像系统中,光源作为成像过程中的重要环节,需要对其进行良好的模型建立,从而深入理解在渲染或实际成像过程中的需求,通过理解光源模型,从而设置合理的曝光时间、光圈大小等参数,对实际工程应用领域也有非常重要的指导作用。

二、光源基础模型

1. 定向光(Directional Light)

     定向光是最简单的光源模型,也叫平行光,通常用于模拟太阳、月亮这类无限远的光。光照亮度 \(C_{light}\) 和光的方向 \(L\) 都是定值,除了光照亮度 \(C_{light}\) 可能会由于阴影而衰减。定向光没有位置,当然,真实的光源都是有位置的。定向光对于光源到场景的距离远大于场景大小的情况。例如:太阳,除了场景在太阳系星球的内部的情况。但有时为了性能或者为了一些特殊效果,也可以把定向光限制在一个“盒子”里面,其方向仍然唯一不变,但颜色有所差异,比如盒子外的颜色为纯黑,而内部的颜色可以是常量也可以是某种插值获得的结果。

2. 点光源(Punctual Light)

     Punctual Light 不是按时赴约的光,而是有位置的光源。用 Punctual 是来自于拉丁语 puctues ,意思是点。点光源不仅有位置,而且均匀的射像空间中所有方向。点光源的方向 \(l\) 依赖于光的位置 \(p_{light}\) 和着色点的位置 \(p_0\) , \(l=\frac{p_{light} - p_0}{\vert p_{light} - p_0 \vert}\) .
也可以写成:
\(d=p_{light} - p_0, r=\sqrt {\vec d \cdot \vec d}, l=\frac{d}{r}\),其中的 \(r\) 不仅可以用于方向向量的归一化,而且可以来计算光照亮度的衰减。
     点光源的强度会随着距离增加而衰减,且与距离的平方成反比,即:

\[c_{light}(r)=c_{light0} \cdot (\frac{r_0}{r})^2 \]

\(c_{light0}\) 是距离为 \(r_0\) 处的光照亮度,由于点光源均匀的向四面大方发射光,将点光源抽象为一个球面波,所以辐照度为 \(E=\frac{\Phi}{4\pi R^2}\) 。
为了防止 \(r=0\) 时,分母为 0 导致出现无限大的光强,所以诸如 UE引擎 里面会在分母上加一个小的参数:

\[c_{light}(r)=c_{light0} \cdot (\frac{r_0 ^2}{r^2+\delta}) \]

这里设置光源半径最小值可能更符合实际光源的情况(实际光源有尺寸大小),这里使用 \(r_{min}\) 作为实际光源的尺寸:

\[c_{light}(r)=c_{light0} \cdot (\frac{r_0 ^2}{max(r,r_{min})^2}) \]

     此外,在实际运用中,通常为了性能考虑,需要对随距离平方衰减的光强再乘以一个窗口函数 (windowing function ),毕竟远处的光很弱,我们可不想为了这些微弱的光徒增计算量,如下图展示了UE4里面点光源及其半径:

image
     注意上图中,在光源最大半径范围以外的区域,是没有计算这个光源光照的,且交界处都有平滑过渡的感觉,所以需要合理设计窗口函数,使光强缓慢衰减且刚好在截止半径处衰减为0。
下图展示了一种窗口函数对于光衰减的影响:

WindowFunction:

\[f_{win(r)}=(1-(\frac{r}{r_{max}})^4)^+;f < 0,f_{win(r)}=0. \]

PythonCode:

import matplotlib.pyplot as plt
import numpy as np
LightRidian = 1
R0 = 2
Sigma = 0.0001
Rmax = 6
r = np.linspace(R0,10,100)
E = LightRidian*R0*R0/(r**2+Sigma)
F_window = 1 - (r/Rmax)**4
F_window_Res = (F_window + abs(F_window)) / 2
Res = E * F_window_Res
plt.plot(r, F_window_Res, color='red', label='F_window: WindowFunc')
plt.plot(r, E, color='green',label='E: Ridian')
plt.plot(r, Res, color='blue', label='E*F_window: Result')
plt.legend()
plt.show()

3. 聚光灯(Spotlight)

     前面所述的点光源,其光强虽然会随着距离而衰减,但是各个方向上是等同的,而此处的聚光灯,更进一步考虑了光强在不同方向上的函数分布。即:

\[c_{light}=c_{light0}f_{dist}(r)f_{dir}(l) \]

     下面我们来确定 \(f_{dir}\) 函数,一个常见的聚光灯模型如图所示:

     锥之间的范围称为半影(penumbra)。内外圆锥的内角分别为和。聚光灯可计算一个聚光灯系数,范围为[0,1],代表某方向的放射比率。内圆锥中系数为1(最亮),内圆锥和外圆锥之间系数由1逐渐变成0。另外,可用另一参数p代表衰减(falloff),决定内圆锥和外圆锥之间系数变化。方程式如下:

\[spot(\alpha)=\left\{ \begin{aligned} 1 \quad if \; cos\alpha \ge cos\frac{\theta}{2} \\ \frac{cos\alpha - cos\frac{\phi}{2}}{cos\theta - cos\frac{\phi}{2}} \quad if \; cos\frac{\phi}{2} \lt cos\alpha \lt cos\frac{\theta}{2} \\ 0 \quad if \; cos\alpha \lt cos\frac{\theta}{2} \end{aligned} \right. \]

ue中的聚光灯如下图:

三、光源模型软件使用@IES Viewer

Reference

  1. Illuminating Engineering Society 照明工程协会软件 IES Viewer
  2. 光源模型-知乎
  3. 光源类型-博客园
  4. learnopengl

标签:分析,cos,frac,光源,模型,window,点光源,light
From: https://www.cnblogs.com/uestc-mm/p/17480130.html

相关文章

  • 为什么RLHF中,PPO需要Critic模型而不是直接使用RewardModel
    在强化学习中,PPO(ProximalPolicyOptimization)算法是一种基于策略梯度的方法,用于训练强化学习智能体。PPO算法中引入Critic模型的主要目的是为了提供一个价值估计器,用于评估状态或状态动作对的价值,从而辅助策略的更新和优化。虽然奖励模型(RewardModel)可以提供每个状态或状态动作......
  • jvm垃圾回收及内存模型
    1、了解垃圾回收之前,必须先了解内存模型 2、垃圾回收区域  a、首先要标记垃圾,找出垃圾   b、Java垃圾回收(一)_java垃圾回收_头发慢点掉的小马的博客-CSDN博客 垃圾回收器   方法区不需要连续的内存,可以选择固定大小或者可扩展。并且还可以选择不实现......
  • MegEngine 使用小技巧:如何做 MegCC 的模型性能评测
    MegCC 是一个深度学习模型编译器,具有以下特点:极轻量级运行时:只在二进制文件中保留所需的计算内核。例如,MobileNetv1的81KB运行时间高性能:每个操作都经过专家精心优化便携:只生成计算代码,易于在Linux、Android、TEE、BareMetal上编译和使用LowMemoryUsagewhileBootIn......
  • 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读
    总览大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~继MetaAI的SAM后,OPPO研究院发布识别一切模型(RecognizeAnythingModel,RAM):项目链接:https://recognize-anything.github.io/Demo链接:https://hugging......
  • java接入科大讯飞的星火模型(ChatSparkDesk)
    目前智能AI比较火热,国外的chatgpt,国内的文言一心,科飞的ChatSparkDesk,之前博客已经写了openai的chatgpt由网友需求,现在分享科大讯飞的星火模型,复制可以修改key可以直接使用不熟悉或者不理解可以加入微信 nlks2023交流,文字聊天简单版,具体可以根据业务修改publicclassChatSpark......
  • arcgis坡度分析
    坡度角反应了坡度的陡峭程度。一般用栅格数据进行分析坡度可表明表面上某个位置的最陡下坡倾斜程度。可针对TIN中的每个三角形和栅格中的每个像元计算坡度。对于不规则三角网(TIN),坡度为各三角形中的最大高程变化率。对于栅格,坡度为每个像元及与其相邻的八个像元中的最大高程......
  • 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读
    总览大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~继MetaAI的SAM后,OPPO研究院发布识别一切模型(RecognizeAnythingModel,RAM):项目链接:https://recognize-anything.github.io/Demo链接:https......
  • HarmonyOS在SDK9版本下FA模型geolocation无法定位问题解决
    问题描述已经在config.json中加入了ohos.permission.LOCATION权限声明,但是在实际开发中,我使用geolocation.getCurrentLocation().then((result)=>{this.locationInfo=JSON.stringify(result);this.blog.setTitle(this.locationInfo);});获取位置信息得不到结果我使用的......
  • 3d模型底模和高模的三条详细区别
    3d模型里底模和高模有哪些区别?在3d建模法线贴图的时候,常常会听到底模和高模两种不同的说法。这两种模型究竟有怎样的区别,有分别有着哪些各异的效果呢?本期,模型云就来为您盘点3d模型底模和高模的区别有哪些。3d模型底模和高模的区别有哪些区别一:面数不同底模又称低模,指的是低精度......
  • 系统架构设计师笔记第14期:系统分析与设计
    面向对象的方法面向对象方法(Object-orientedmethods)是一种软件开发方法,其核心思想是将软件系统建模为对象的集合,这些对象之间通过消息传递进行交互。面向对象方法强调对象的概念、封装、继承和多态等特性,以实现软件系统的可重用性、可维护性和灵活性。以下是面向对象方法的一些关......