第09章 反射模型剖析
简单光反射模型 -回复

简单光反射模型-回复什么是简单光反射模型?简单光反射模型是光学领域中描述物体表面对光的反射行为的一种模型。
它假设光线在物体表面的反射是理想光滑平面的反射,并且不考虑光的衍射和散射现象。
这个模型被广泛应用于计算机图形学、渲染、光学设计等多个领域中。
在本文中,我们将深入探讨简单光反射模型的基本原理、应用以及一些相关的扩展模型。
一、基本原理简单光反射模型主要基于光的入射角和反射角之间的关系来描述光线在物体表面的反射。
这里的入射角指的是光线与垂直于物体表面的方向之间的夹角,而反射角指的是光线与物体表面法线方向之间的夹角。
根据光的基本性质,入射角和反射角之间的关系可以由反射定律来描述,即入射角等于反射角。
根据这个原理,我们可以得出一个结论:当光线以垂直于物体表面的角度入射时,它将沿相同的角度反射。
而当光线以斜角入射时,它将以相同的角度相对于物体表面法线进行反射。
二、应用简单光反射模型有着广泛的应用。
在计算机图形学中,它用于逼真地渲染物体表面的光照效果。
通过计算入射光线与物体表面的反射角,可以模拟出不同材质和形状的物体对光的不同反射效果,从而增强图像的真实感。
在光学设计中,简单光反射模型可以用来优化光学器件的性能。
通过精确计算入射光线与物体表面的反射角,可以确定光线的传输路径,进而优化光学系统的效率和能量分布。
此外,简单光反射模型还被广泛用于光照分析和相机校准等领域。
在光照分析中,它可以帮助分析光照条件对物体表面颜色和亮度的影响。
在相机校准中,可以利用简单光反射模型来准确计算相机的内外参数,从而提高摄像机在3D场景中的测量和定位精度。
三、相关扩展模型简单光反射模型的基本原理可以通过一些扩展模型进行进一步优化。
其中最常见的是Lambertian光反射模型和Phong光反射模型。
Lambertian光反射模型考虑了光线在物体表面的漫反射和散射现象,相较于简单光反射模型更加接近实际光线的传播效果。
它是根据Lambert 定律建立的,该定律认为物体表面的辐射能量与入射光线的夹角成正比。
中间件技术概论(9-2)

• 实现层
– 互操作:不同ORB之间很难实现互操作安全; – 协议:可插入协议目前无标准; – 截取器:目前处在RFP阶段; – 外部独立性:不好;
March 21, 2006
浙江大学计算机学院
14
最小的方面.粒度层次是:类,对象,方法,方法调用等.
March 21, 2006
浙江大学计算机学院
5
反射:典型例子(4)
• 1.3-Lisp和反射塔
– 程序可以访问解释器的数据结构,由此来实现反射连接. – 结构建模为无限层的解释器构成的塔,每一个解释器同时
也是由其上层的解释器解释的一个程序,用户的程序运行 在塔的最低层.
– 通过执行程序可以改变下层系统的某些方面.
March 21, 2006
浙江大学计算机学院
7
反射:反射分类(6)
• 3.过程性反射
– 系统的自表示是由实现系统的程序给出的; – 既用于实现系统,又用于推理系统.
• 4.说明性反射
– 仅包括有关系统的说明,不是系统的实现; – 关心的是系统的实现达到的目标;
March 21, 2006
浙江大学计算机学院ห้องสมุดไป่ตู้
8
面向对象系统中的反射技术(1)
• 反射模型
– 元类模型
March 21, 2006
浙江大学计算机学院
9
CORBA安全(2)
• 分布式对象的安全问题
– 分布式对象之间不能轻易相信对方; – 分布式对象属于开放体系结构,不断变化,发展; – 分布式对象之间的交互作用难以预测; – 分布式对象使用者对使用对象缺乏了解和控制; – 分布式对象的数目增多;
光线反射的数学模型 位置和方向坐标

光线反射的数学模型位置和方向坐标光线反射的数学模型位置和方向坐标光线反射是光线在与物体表面相遇时发生的现象,它遵循一定的数学模型。
在光学中,我们常常使用位置和方向坐标来描述光线的传播路径和反射方向。
本文将从数学模型的角度来探讨光线反射的位置和方向坐标。
一、光线的传播路径光线在传播过程中,遵循直线传播的原则。
我们可以使用直线方程来描述光线的传播路径。
直线方程一般形式为y = kx + b,其中k 为斜率,b为截距。
在光线的传播过程中,我们可以将直线方程改写为向量形式。
假设光线的起点位置坐标为(x1, y1),终点位置坐标为(x2, y2),则光线的传播路径可以表示为向量v = (x2 - x1, y2 - y1)。
二、光线的反射方向当光线与物体表面相遇时,根据反射定律,入射角等于反射角。
我们可以使用向量运算来描述光线的反射方向。
假设入射光线的方向向量为v1,物体表面的法向量为n,反射光线的方向向量为v2,则有以下关系:v1 = |v1| * cosθ1 * nv2 = |v2| * cosθ2 * n其中,|v1|和|v2|分别为入射光线和反射光线的长度,θ1和θ2分别为入射角和反射角的大小。
根据向量运算规则,我们可以将入射光线和法向量进行向量叉乘,得到反射光线的方向向量。
向量叉乘的结果为一个新的向量,它垂直于入射光线和法向量所在的平面。
v2 = v1 - 2 * (v1 · n) * n其中,v1 · n表示向量v1和n的点积运算。
三、光线的位置和方向坐标在光线的传播过程中,我们需要确定光线的位置和方向坐标。
位置坐标用来表示光线的起点位置,方向坐标用来表示光线的传播方向。
假设光线的起点位置坐标为P(x, y, z),方向坐标为D(a, b, c),则光线的位置和方向坐标可以表示为向量R = (x, y, z) + t * (a, b, c),其中t为参数。
光线的传播路径可以看作是沿着方向向量D的无限延伸。
C#反射(Reflection)详解

C#反射(Reflection)详解1、什么是反射2、命名空间与装配件的关系3、运⾏期得到类型信息有什么⽤4、如何使⽤反射获取类型5、如何根据类型来动态创建对象6、如何获取⽅法以及动态调⽤⽅法7、动态创建委托1、什么是反射Reflection,中⽂翻译为反射。
这是.Net中获取运⾏时类型信息的⽅式,.Net的应⽤程序由⼏个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,⽽反射提供⼀种编程的⽅式,让程序员可以在程序运⾏期获得这⼏个组成部分的相关信息,例如:Assembly类可以获得正在运⾏的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:⽅法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调⽤之。
MethodInfo包含⽅法的信息,通过这个类可以得到⽅法的名称、参数、返回值等,并且可以调⽤之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
2、命名空间与装配件的关系很多⼈对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进⾏澄清。
命名空间类似与Java的包,但⼜不完全等同,因为Java的包必须按照⽬录结构来放置,命名空间则不需要。
装配件是.Net应⽤程序执⾏的最⼩单位,编译出来的.dll、.exe都是装配件。
装配件和命名空间的关系不是⼀⼀对应,也不互相包含,⼀个装配件⾥⾯可以有多个命名空间,⼀个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例⼦:装配件A:1. namespace N1{public class AC1 {…}public class AC2 {…}}namespace N2{public class AC3 {…}public class AC4{…}}装配件B:1. namespace N1{public class BC1 {…}public class BC2 {…}}namespace N2{public class BC3 {…}public class BC4{…}}这两个装配件中都有N1和N2两个命名空间,⽽且各声明了两个类,这样是完全可以的,然后我们在⼀个应⽤程序中引⽤装配件A,那么在这个应⽤程序中,我们能看到N1下⾯的类为AC1和AC2,N2下⾯的类为AC3和AC4。
反射原理

Net 中的反射(序章) - Part.1引言反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助。
反射是一个庞大的话题,牵扯到的知识点也很多,包括程序集、自定义特性、泛型等,想要完全掌握它非常不易。
本文仅仅对反射做一个概要介绍,关于它更精深的内容,需要在实践中逐渐掌握。
本文将分为下面几个部分介绍.Net中的反射:1.序章,我将通过一个例子来引出反射,获得对反射的第一印象。
2.反射初步、Type类、反射普通类型。
(修改中,近期发布...)3.反射特性(Attribute)。
4.xxxx (待定)5....序章如果你还没有接触过反射,而我现在就下一堆定义告诉你什么是反射,相信你一定会有当头一棒的感觉。
我一直认为那些公理式的定义和概念只有在你充分懂得的时候才能较好的发挥作用。
所以,我们先来看一个开发中常遇到的问题,再看看如何利用反射来解决:在进行数据库设计的过程中,常常会建立一些基础信息表,比如说:全国的城市,又或者订单的状态。
假设我们将城市的表,起名为City,它通常包含类似这样的字段:Id Int Identity(1,1) 城市IdName Varchar(50) 城市名称ZIP Varchar(10) 城市邮编... // 略这个表将供许多其他表引用。
假如我们在建立一个酒店预订系统,那么酒店信息表(Hotel)就会引用此表,用CityId字段来引用酒店所在城市。
对于城市(City)表这种情况,表里存放的记录(城市信息)是不定的,意思就是说:我们可能随时会向这张表里添加新的城市(当某个城市的第一家酒店想要加入预订系统时,就需要在City表里新添这家酒店所在的城市)。
此时,这样的设计是合理的。
1.建表及其问题我们再看看另外一种情况,我们需要标识酒店预订的状态:未提交、已提交、已取消、受理中、已退回、已订妥、已过期。
全反射知识讲解

2. 衰逝波
EEei( tktxsin2ktz sin1n2/ n)
t
0t
Ee e ( 172) ktz sin1n2 i( tktxsin1 / n) 0t
这是一个沿着 z 方向振幅衰减,沿着界面 x 方向传 播的非均匀波,也就是全反射时的衰逝波。
2020/8/19
2. 衰逝波
沿 x 方向传播的速度为
x=sin1
(173)
式中, 、 分别
2. 衰逝波
定义衰逝波沿 z 方向衰减到表面强度1/e 处的深度为 衰逝波在第二个介质中的穿透深度。穿透深度 z0 很容
易由 ktz0= sin21n2/n1
z0= kt
1
sin21n2/n
量的相位变化不同,它们之间的相位差取决于入射角
1和二介质的相对折射率 n,由下式决定:
rsrp2arctancos1sisn in 2 2 11n2 (171)
因此,在 n 一定的情况下,适当地控制入射角 1 , 即可改变Δ,从而改变反射光的偏振状态。
2020/8/19
1. 反射波
例如,图所示的菲涅耳菱体就是利用这个原理将入 射的线偏振光变为圆偏振光的。对于图示之玻璃菱
rs 、 rp 为全反射时,反射光中的 s 分量、p 分量光
场相对入射光的相位变化。
2020/8/19
1. 反射波
由上式可见,发生全反射时,反射光强等于入射光强, 而反射光的相位变化较复杂,大致规律如图所示。
rs
rs
0
B C /2 1
0
B C /2 1
2020/8/19
1. 反射波 应特别指出,在全反射时,反射光中的 s 分量和 p 分
反射理论

反射理论 一、传输线1.1、传输线模型在高速电路的世界里,因操作频率的升高,波长相对变短。
当波长与线路的长度接近到相近的数量级时,必须把信号当电磁波来看。
当高速信号沿着信号线传输时,会存在电阻、分布电容和分布电感(如图A )。
分布电感和分布电容的存在,为反射的产生提供了先决条件。
1.2、信号沿传输线传输的过程在低速信号传输时,我们认为发送的信号与接收的信号是同时到达的,且信号的形状完全一样,然而在高速电路下,情况将不是这样,可通过一个例子来说明: 在图B 中,电源+E 经开关S1与传输线的始端相连,传输线的终端接负载R ,假设传输线本身的电阻很小,可忽略不计。
那么,当开关合上时,传输线两端的电压和电流将出现什么变化? 许多人会说,“开关合上后,传输线各点的电压由0V 变为+E ,电流等于E/Z0。
” 这个回答对于达到稳定的情况是正确的,然而在开关合上的瞬间,情况不是这样的。
从上述模型中可以看到,每一根传输线都具有一定的电感和电容。
假设传输线分成许多长度为ΔXi 的小段,设每一小段具有电感L i 和电容C i (i 设为段号)。
我们知道由于电感的存在将阻碍电压的突变,由此出发我们来看一下信号传输的瞬态过程。
开关合上的瞬时(t =0),传输线始端电压V 0由0变为+E ,这时C 1尚未充电,因此全部的电压变化加到L 1上,由于电感中反电动势的作用,使得电感中电流的变化迟后于加在它上面的电压变化,此后,随着电感L 1上电流i 1的增加,将流过C 1使电容充电,而电容上电压的变化又要滞后于它的充电电流的变化,因此电压U 1的变化相对于U 0的变化又滞后一段时间Δt ,由于ΔL和ΔC数值很小,因此引起的延迟时间也是很小的。
当U1开始上升时,由于L2的存在,又阻碍着电流立即进入第二小段,当经Δt时间,C1上的电压已充到V1=+E时,L1两端的电压差等于0,它的电流达到某一个值(设为I),暂时保持不变,这时这个电流进入第二小段,成为C2的充电电流iXY 图C、传输线上电压波和电流波图A 、R :Resistance per Unit LengthL: Inductance per Unit Length C: Capacitance per LengthG: Conductance per Unit Length2。
简单光反射模型 -回复

简单光反射模型-回复何谓简单光反射模型?简单光反射模型是计算机图形学中用于模拟光线在物体表面的反射行为的一个基本模型。
它基于光线在物体表面上的折射和反射现象,通过计算光线的路径和光照条件来生成逼真的图像。
简单光反射模型包括三个主要组成部分:光源、物体和观察者。
光源是产生光线的对象,物体是待渲染的对象,观察者是最终观察图像的对象。
通过模拟光线从光源射到物体上,然后从物体上反射或折射到观察者处的过程,可以得到具有光影效果的图像。
首先,光线从光源发出并射到物体上。
假设在物体上有一个触发器,不同触发器的反射规律不同。
触发器会影响光线的反射方向和颜色。
当光线到达物体表面时,部分光线会被吸收,部分光线会被反射出来。
反射出来的光线称为漫反射光线,它沿着与光线入射方向相反的方向散射。
漫反射光线的颜色取决于物体表面的材质和光照的颜色。
材质表面越光滑,反射效果越强,反射光线的颜色越鲜亮。
光照的颜色越亮,反射光线的颜色越亮。
接下来,部分光线会经过物体表面的折射现象,这种现象在透明或半透明物体上比较常见。
折射现象发生的原因是光线在经过介质界面时速度的改变。
根据折射定律可以得知,光线从密度较高的介质进入到密度较低的介质时,会向法线方向弯曲,进一步发生的折射可以用斯涅尔定律来描述。
折射光线的方向和颜色也取决于物体表面的材质和入射光线的方向和颜色。
最后,当光线经过反射和折射后到达观察者的位置时,观察者可以看到物体表面上的颜色和纹理。
观察者所观察到的图像是由这些反射和折射光线的颜色和分布所决定的。
观察者的位置和观察角度也会对观察图像产生影响。
观察者位置的变化会导致视角的改变,从而影响到物体表面上光线的入射角度,进而影响到反射和折射光线的方向和强度。
简单光反射模型在计算机图形学中被广泛应用于三维渲染中。
它为计算机生成的图像增加了逼真感和光影效果,使得生成的图像更加真实。
随着计算能力的提升和渲染算法的进步,简单光反射模型正在不断被拓展和改进,以满足更加复杂的场景和效果需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章反射模型本章定义了一组类来描述光源是如何在表面上散射的。
回忆一下,在第5.4节中我们介绍了双向反射分布函数(BRDF),来描述光在某个表面上的反射;又介绍了BTDF来描述在表面上的透射,而BSDF把这两种效果综合起来。
描述真实表面上的散射的最好方法常常是多个BRDF和BTDF的综合;在第10章里,我们将介绍一个BSDF对象,将多个BRDF和BTDF组合在一起来表示光在表面上的总体上的散射效果。
本章不考虑在表面上反射性质和透射性质发生变化的情况,在第11章中,描述纹理的类会处理这个问题。
表面反射模型有几个来源:1. 实验数据:许多真实世界中的表面的反射分布性质是在实验室里测量出来的。
这些数据可以直接放在表格里使用,或者用来计算一组基函数的系数。
2.现象学模型:建立描述真实世界里表面的性质的方程,并且这些方程可以很有效地模拟出这些性质。
像BSDF这类模型就非常好用,因为它们可以用直观的参数来改变模型的行为(例如“粗糙度”)。
计算机图形学中的许多反射函数都属于这个范畴。
3.仿真:有时我们知道一个表面的组成部分的底层信息。
例如,我们可能知道一种颜料是由悬浮在介质中的大小大致相同的彩色颗粒组成的,或者知道一种编织物是有两种类型的线构成,每种线都有已知的反射特性。
在这样的情况下,我们可以通过模拟微观几何的散射来得到反射数据。
这个模拟过程可以是在渲染中进行的,也可以是一种预处理过程,并由此拟合出一组基函数以备后用。
4. 物理(波动)光学: 有些反射模型是由一种非常精细的光模型推衍出来的,其中光被视为一种波,并通过解麦克斯韦方程来研究光在表面上的散射过程。
这些模型通常需要耗时的计算,却并不一定会得到比几何光学模型更精确的结果。
5,几何光学:跟仿真方法相似,如果知道了表面的底层的散射和几何性质,就可以从这些性质中推导出有解析表达式的反射模型。
几何光学模型使得光对表面的交互作用更容易处理,因为诸如偏振现象的复杂效应被忽略了。
基本术语为了比较不同反射模型的视觉效果,我们介绍一些关于表面反射的基本术语。
表面反射可以分为四大类:漫反射(diffuse),光泽镜面反射(glossy specular),理想镜面反射(perfect specular),逆反射(retro-reflective)。
大多数表面的反射是这四类反射的混合。
漫发射将光线均等地向所有方向上散射。
虽然很难见到理想的漫反射表面,但接近漫反射的例子有无光泽的黑板,无光涂料等等。
象塑料、高光泽涂料这样的光泽镜面表面向一组特定的方向进行散射--它们可以映照出其它物体的模糊的映像。
理想镜面表面只向一个单一的方向散射。
镜子和玻璃是理想镜面表面的例子。
最后,象天鹅绒或在地球上看到的月亮这样的逆反射表面主要向入射光方向对光线进行散射。
(如图:a -漫反射, b -光泽镜面反射, c -理想镜面反射, d -逆反射)。
给定了一个反射类型,反射分布函数可以是各向同性(isotropic)的或者是各向异性(anisotropic)的。
大多数物体是各向同性的:如果选定表面上的一个点绕着该点的法向量旋转它,所反射的光的总量不变。
相反地,对各向异性材料做这样的旋转,就会反射出不同量的光。
各向异性表面的例子有被擦亮的金属、唱机唱片和CD盘片。
几何设置在pbrt中的反射计算是在一个反射坐标系中进行的,在该坐标系中,被着色的点上的两个切向量和法向量分别跟x,y,z轴对齐,所有BRDF和BTDF函数的传入向量和返回向量都是在这个坐标系下定义的。
理解好这个坐标系对后面理解BRDF和BTDF的实现非常重要。
着色坐标系还给出了一个用球面坐标(θ,Φ)来表示方向的标架;角度θ是给定方向跟z轴的夹角,Φ是给定方向在xy平面上的投影跟x轴的夹角。
(如图)给定了在该坐标系中的一个方向,就可以很容易地计算出它与法向量夹角的余弦,等等:cos θ = (n . ω) = ( (0, 0, 0) . ω) = ωz下面就是求这个余弦值的工具函数:<BSDF Inline Function> =inline float CosTheta (const Vector &w) { return w.z;}利用sin2θ + cos2θ = 1, 可得到相应的正弦值:<BSDF Inline Functions> +=inline float SinTheta(const Vector &w) {return sqrtf(max(0.f, 1.f - w.z * w.z));}下面是求sin2θ的工具函数:<BSDF Inline Functions> +=inline float SinTheta2(const Vector &w) {return 1.f - CosTheta(w) * CosTheta(w);}类似地我们可以用着色坐标系统来简化关于Φ的正弦和余弦计算。
在着色点所在的平面上方向ω有坐标(x, y),分别为r cosΦ 和r sinΦ。
而半径r即是sin θ,因此:cos Φ = x / r = x / sin θsin Φ = y / r = y / sin θ<BSDF Inline Functions> +=inline float CosPhi(const Vector &w) {return w.x / SinTheta(w);}inline float SinPhi(const Vector &w) {return w.y / SinTheta(w);}我们要遵守的一个约定是,入射光ωi和向外的观察方向ωo 在被变换到表面上的局部坐标系以后,都是被正规化的,且方向都朝外。
根据约定,表面法向量总是指向物体之外的,这就很容易确定光线是进入还离开透光物体:如果入射光方向ωi跟n在同一个半球,则光线是在进入,否则就是在离开。
因此,需要记住的这一点:表面法向量可能跟ωi或者ωo(或者两者都有)不在物体的同一侧。
跟许多其它渲染器不同的是,pbrt并不为了保持ωo和法向量在表面同一侧而翻转法向量。
所以,在实现BRDF和BTDF时就不能做这样的假定。
还有,应该注意用于着色的局部坐标系可能并不等同于Shape::Intersect()所返回的坐标系,它们在求交过程和着色过程之间可以做些改动以达到象凸凹纹理映射(bump mapping)这类的效果。
在阅读本章时还要注意的一点是,BRDF和BTDF的实现不应该关心ωi和ωo是否位于同一个半球。
例如,虽然一个反射BRDF应该探测是否入射光方向在表面的上面并且出射方向在表面的下面,从而可判定在这种情况下不存在反射,但是我们希望反射函数能够利用反射模型中的相应公式来计算光的反射量,而忽略它们是否在同一个半球这个细节。
更高层的pbrt代码会保证反射例程或透射的散射例程能在恰当的时机被调用。
9.1 基本接口首先我们定义BRDF和BTDF函数的接口。
BRDF和BTDF共享一个基类,BxDF,它定义了要实现的基本接口。
两类函数共用一个接口,共享一个基类,可以减少重复性代码,也可以是系统的某些部分可以使用BxDF而不必区分BRDF和BTDF。
<BxDF Declarations> =class COREDLL BxDF {public:<BxDF Interface><BxDF Public Data>};将要在第10.1节介绍BSDF类存放一组BxDF对象来共同地描述表面上一个点的散射情况。
虽然我们通过使用一个共同接口而隐藏了关于反射材质和透射材质的实现细节,但是第16章所介绍的一些光传输算法需要区分这两种类型。
因此,所有的BxDF要有一个BxDF::type成员还存放BxDFType标志。
对于每个BxDF而言,标志必须在BSDF_REFLECTION或BSDF_TRANSMISSION集合中取一个值,而且必须是漫反射、光泽反射和镜面反射标志之一。
注意这里没有逆反射标志,这里的分类将逆反射视为光泽反射。
<BSDF Declarations> =enum BxDFType {BSDF_REFLECTION = 1 << 0,BSDF_TRASNMISSION = 1 << 1,BSDF_DIFFUSE = 1 << 2,BSDF_GLOSSY = 1 << 3,BSDF_SPECULAR = 1 << 4,BSDF_ALL_TYPES = BSDF_DIFFUSE | BSDF_GLOSSY | BSDF_SPECULAR,BSDF_ALL_REFLECTION = BSDF_REFLECTION | BSDF_ALL_TYPES,BSDF_ALL_TRASNMISSION = BSDF_TRASNMISSION | BSDF_ALL_TYPES,BSDF_ALL = BSDF_ALL_REFLECTION | BSDF_ALL_TRASNMISSION};<BxDF Public Data> =const BxDFType type;<BxDF Interface> =BxDF(BxDFType t) : type (t) { }MatchesFlags()工具函数用来确定BxDF是否具备用户提供的标志:<BxDF Interface> +=bool MatchesFlag(BxDFType flags) const {return (type & flags) == type;}BxDF的关键函数是BxDF::f()。
它返回给定的一对方向所对应的分布函数值。
这个接口隐性地假定不同波长上的光是不相干(decoupled) 的,即一个波长上的能量不会以不同的波长被反射出去。
这样一来,就不会支持萤光材料了。
有了这个假定,反射函数的结果就可以直接用一个Spectrum来表示:<BxDF Interface> +=virtual Spectrum f(const Vector &wo, const Vector &wi) const = 0;并不是所有的BxDF都用该函数求值。
例如,象镜子、玻璃或水这样的全镜面反射物体只在单一出射方向上对单一方向的入射光进行散射。
描述这样的BxDF的最好方法是delta分布函数:除了出射方向之外,其它方向的值都为0.在pbrt中,这些BxDF需要特殊的处理,所以我们提供BxDF::Sample_f()函数。
我们用这个函数处理由delta分布来描述的散射,也用它来对BxDF所散射出的多个光线的方向进行随机采样(见第15章)。