真实感图像渲染系列:使用json初始化场景

这是真实感图像渲染系列的第三篇文章。

场景初始化的必要性

不同于普通的编程作业,图像渲染的场景结构非常复杂,比如同样是物体,一个球体需要读入中心坐标以及半径,而平面则只需要一个定位坐标以及法线方向就能够确定。如何初始化一个场景,为每一个参数赋予正确的初始值是非常重要的。

在参考过往代码发现场景的初始化无非两种方式:一种是将场景作为一个类写在源代码中;另一种是将场景写在文本文件中,对于所有需要初始化的类写一个接口来读取文件。在我的代码中,使用了第二种初始化方式。就编译效率上来说,第二种方式可以防止每次修改模型都重新编译。这在后期可以优化出很多时间。

场景初始化方式

一方面,我使用json格式储存场景,json格式的读取在C++中确实不算简单,需要安装jsoncpp库。jsoncpp库提供了一个数据类型 Json::Value ,这个数据类型支持整数下表访问(用于访问列表),以及字符串下表访问(用于访问字典),以及各种转换函数如 val.asDouble() 等。最终场景的json文件附在本文末尾。

jsoncpp的简单使用可以参考 通过jsoncpp库的CharReaderBuilder解析字符串

我使用伪·visitor设计模式初始化场景,对于每一个需要初始化的类申明一个成员函数 void accept(const Json::Value& val); 接受一个 Json::Value 用于初始化自身。

例如,对于vector来说,accept函数如下。

而一个包含vector的sphere类,可以拥有如下accept函数

可见,至少在安装了库之后,json的读取是足够简单的。

为场景添加功能

场景本身会被后续不同的渲染算法所使用,为了增加代码复用性,我们可以把渲染算法公共的一些函数放在场景中,例如求一个光线最近碰撞到的物体的函数 findCollidedObject 等。最终场景类如下

后续的光线追踪等代码,都会直接继承scene来使用scene的这些接口。

源代码

场景json文件

 

原创文章地址:【真实感图像渲染系列:使用json初始化场景】,转载时请注明出处mhy12345.xyz

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据