第一章 文学编程

基于物理模式的渲染

渲染是从三维场景描述中生成图像的一个过程。很显然,这是一项应用非常广泛的任务,并且有许多方法可以实现。基于物理基础的技术试图模拟地更真实,也就是说,他们利用物理原理来模拟实现光与物质的相互作用。而基于物理的方法可能看起来。

1.1文学编程

在编写tex排版系统时,Donald Knuth 开发了一种新的编程方法,该方法是基于简单而又革命性的思想,即程序应该写出来,更多的是为了人们的消费而不是电脑消费(programs should be written more for people’s consumption than for computers’ consumption)。他把这种方法命名为“文学编程”。文学编程是文档格式语言(如tex或者html)和编程语言(如C++)混合而成的元语言或者叫做理想语言。两个单独的系统处理程序:一个“编织器(weaver)”,将这个文学编程转换成适合排版的文档,一个“tangler”生成适合编译的源代码。

文学编程元语言提供了两个重要特征;第一个是,能够把散文与源代码混合起来。该功能使程序的注释和它的实际源代码一样重要,鼓励精心设计和文档编制。其次,语言提供以完全不同于编译输入的顺序机制方式展示程序代码。因此,该程序可以以逻辑方式描述,每个命名块代码称为片段,每个片段都可以通过名称引用其他片段。如一个为程序所有全局变量初始化函数 InitGlobals():

void InitGlobals(){
    nMarbles = 25.7;
    shoeSize = 13;
    dielectric = true;
}

尽管简洁,但没有任何上下文,仍很难理解。这是为什么尼?例如,变量nMarbles是否可以使用浮点值?看一下代码,需要搜索整个程序,以查看每个变量是声明。为了使用它,需要了解它的目的和意义。虽然这个结构对于编译器来说是很好的,但是读者宁愿看到每个变量在声明附近进行分别初始化。

在文学编程中,可以以如下方式改写InitGlobals(),注-=为,后面一样用-=代表:

<Function Definitions>-=
     void InitGlobals(){
          <Initalize Global Variables z>
 }

这段代码包含了InitGlobals()函数的定义被称为函数定义<Function Definitions>。初始化函数InitGlobals()引用另外一个片段<initialize Global Variables>。由于这段初始化片段没有被定义,我们除了知道该函数包含分配全局变量之外,不知道任何功能。对目前而言,这只是一个正确的抽象级别,因为没有任何变量已经声明。当我们在后面引入全局变量shoeSize时,我们可以写作:

<Initialize Global Variables>-=
    shoeSize = 13;

在这里,我们开始定义<Initialize Global Variables>的内容。当文学项目被用于源代码的编译,文学编程系统将在InitGlobals()函数定义内自动的用shoeSize=13进行代替。在后面的过程中,我们可能定义另外一个全局变量:dielectric,我们就可以在原来的初始化片段上进行附加,如下:

<Initialize Global Variables>+-=
     dielectric = true;

在片段后面的符号+-=表示我们在以前的定义代码片段后添加新的赋值。当融合三个片段在一起后,代码就成为:

void InitGlobals(){
    shoeSize = 13;
    dielectric = true;
}

使用这种方式,我们可以分解复杂的函数分解成逻辑上不同的块,进而更容易理解。例如,由一系列复代码片段组成的复杂的函数:

<Function Definitions>+-=
    vodi complexFunc(int x, int y, double *values){
        <Check Validity of arguments>
        if (x < y)
             <Swap parameter values>
        }
        < Do precomputation before loop >
        < Loop through and update values array >
} 

每一段代码片段在函数complexFunc()编译中被扩展。在本文,介绍每一个代码段和它的实现。在文档中,我们可以依次介绍每个片段及其实现。这种分解使我们每次呈现几行代码,从而使代码更容易理解。另一个优点是,这种编程风格以逻辑片段分离函数,每个都有一个单一且明确的目的,每个都可以独立地写、验证或阅读。总的来说,我们将尽力使每一个片段不到10行。

注:本文及以下文章均译自pbrt第三版。仅供学习、研究与交流,版权/著作权均归pbrt!!

版权所有@pbrt;pbrt官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值