精华内容
下载资源
问答
  • pbrt,版本4(早期发布) 这是pbrt-v4的早期版本,该渲染系统将在(最终)即将出版的第四版《基于物理的渲染:从理论到实现》中进行介绍。 (我们希望能在2021年的几个月前发布该书的在线版本,并在2021年夏季发布...
  • 此存储库提供以下场景以与使用。 我们将在未来几周内添加更多场景,并很乐意接受其他场景的贡献! 巴塞罗那馆 范德罗经典,包括白天和夜间照明设置。 在白天设置中,所有照明都来自在 HDR 环境贴图中编码的逼真天空...
  • 这个项目的目标是提供一个免费的(Apache许可的)开源工具,以轻松(快速)加载PBRT文件(例如PBRT自己的“ pbrt-v3-scenes”测试场景或迪士尼的Moana island模型)。 特别是 包含纯语法的和更高级的语义解析器...
  • pbrt,版本3 该存储库包含pbrt版本的源代码,该版本在 , 和Greg Humphreys的第三版《基于物理的渲染:从理论到实现》中进行了描述。 和以前一样,该代码在BSD许可下可用。 有有关基于物理的渲染书以及pbrt的许多...
  • rs_pbrt Rust板条箱实现与PBRT书(第3版)的C ++代码相对应的代码: 当前的Rust文档: 用法 > cargo build --release --no-default-features > ./target/release/rs_pbrt --help pbrt 0.8.3 Parse a PBRT scene ...
  • pbrt-v3.7z

    2020-07-27 05:10:42
    这个源码是pbrt v3书籍对应的官方源码,github上有,但下载速度很慢,这里方便大家下载使用,整个代码是完整的,在windos平台和linux平台测试过了,都能正常运行,希望能帮助大家学习
  • pbrt-v3.zip

    2020-04-24 20:25:57
    PBRT (Physically based rendering toolkit)是一个基于光线追踪的物理渲染系统。 使用git下载的完整(包含依赖)的文件,亲测可以直接cmake构建
  • 我尝试在锈病中实施PBRT。 工作正在进行中
  • pbrt-重要性-采样 PBRT 扩展对 brdf 数据使用重要性采样算法用于数据压缩(brdf 功能):Douglas Peucker
  • PBRT第二版3

    2014-11-07 17:57:36
    该书所描述的pbrt是基于光线追踪算法的物理学渲染系统。其它相关的书籍只是介绍原理,算法,或许还夹杂些少许源代码。该书则不同,因为它带了一个完全能工作的完备的渲染系统。(正是这个原因,有很多人用这个系统为...
  • 鸣上 轻量级PBRT样式的基于频谱的路径跟踪器
  • PBRT阅读笔记

    2016-09-12 09:48:45
    这个是整理至开源论坛上光线跟踪的讲义,方便大家阅读转至网址http://www.opengpu.org/bbs/forum.php?mod=viewthread&tid=4148&highlight=pbrt
  • SimpleRenderer 一个基于pbrt设计的简单渲染器。 第二章:几何与变换 向量 观点 普通的 射线(离开射线微分级) 边界框 转型
  • PBRT

    2019-09-29 22:20:09
  • pbrt 基于光线跟踪器。 建造 需要一个符合C ++ 20的编译器。 该项目通常以以下方式建造: MSVC 19.28 铛10.0 GCC 10.2 CMake 3.14或更高版本。 请注意,对于CMake构建,警告级别设置为错误, 因此,由于其他...
  • pbrt_v3_JDH-源码

    2021-03-26 14:25:43
    pbrt,版本3 该存储库包含pbrt版本的源代码,该版本在 , 和Greg Humphreys的第三版《基于物理的渲染:从理论到实现》中进行了描述。 和以前一样,该代码在BSD许可下可用。 有有关基于物理的渲染书以及pbrt的许多...
  • ##Implementation 我们正在使用 pbrt-v2,它是我们从分叉出来的,它的 README 可以在 pbrt-README.txt 中找到。 ##Installation 克隆此存储库或下载源代码后,运行 make 在 src/ 文件夹中并生成二进制文件。 ##...
  • PBRT第二版1

    2014-11-07 17:53:40
    该书所描述的pbrt是基于光线追踪算法的物理学渲染系统。其它相关的书籍只是介绍原理,算法,或许还夹杂些少许源代码。该书则不同,因为它带了一个完全能工作的完备的渲染系统。(正是这个原因,有很多人用这个系统为...
  • PBRT第二版4

    2014-11-07 17:59:06
    该书所描述的pbrt是基于光线追踪算法的物理学渲染系统。其它相关的书籍只是介绍原理,算法,或许还夹杂些少许源代码。该书则不同,因为它带了一个完全能工作的完备的渲染系统。(正是这个原因,有很多人用这个系统为...
  • 对于PBRT-V3场景文件.pbrt格式,小编自己根据自己的理解总结如下:1,“#”后面的内容为注释举例1:#sphere.pbrt #first we set up the eye2,每一行的第一个词为“关键字”,在api.cpp中对应着处理函数。举例2:#...

    对于PBRT-V3场景文件.pbrt格式,小编自己根据自己的理解总结如下:

    1,“#”后面的内容为注释

    举例1:

    #sphere.pbrt
    #first we set up the eye

    2,每一行的第一个词为“关键字”,在api.cpp中对应着处理函数。

    举例2:

    #first we set up the eye
    LookAt 1 1 10   0 0 -1  0 1 0 #ex ey ez lx ly lz ux uy uz
    
    #the camera
    Camera "perspective" "float fov" [30]
    
    #name the file
    Film "image" "string filename" ["sphere.exr"]
         "integer xresolution" [200] "integer yresolution" [200]
    
    Integrator "whitted"
    
    #begin describing scene
    WorldBegin
    
    #light source
    AttributeBegin
      CoordSysTransform "camera"
      LightSource "distant" 
                  "point from" [0 0 0] "point to"   [0 0 1]
                  "color L"    [3 3 3]
    AttributeEnd

    在api.cpp中:

    关键字“LookAt”对应的处理函数是pbrtLookAt();
    关键字“Camera”对应的处理函数是pbrtCamera();
    关键字“Film”对应的处理函数是pbrtFilm();
    关键字“Integrator”对应的处理函数是pbrtIntegrator();
    关键字“WorldBegin”对应的处理函数是pbrtWorldBegin();
    关键字“AttributeBegin”对应的处理函数是pbrtAttributeBegin();
    关键字“CoordSysTransform”对应的处理函数是pbrtCoordSysTransform();
    关键字“LightSource”对应的处理函数是pbrtLightSource();
    关键字“AttributeEnd”对应的处理函数是pbrtAttributeEnd();

    关键字还有:Translate,Rotate,Scale,Material,Shape等等。

    3,AttributeBegin和AttributeEnd是成对顺序出现,最临近的一对包含的内容可是为一个block。

    举例3:

    AttributeBegin
      Translate 0 -1 0
      Rotate 35 0 1 0
    
      #define a sphere
      AttributeBegin
        Translate -1 .75 -1.5
        Rotate -90 1 0 0
    
        Material "matte" "color Kd" [0.1 0.9 0.1]
    
        Shape "sphere" "float radius" [.75] 
      AttributeEnd
    
      #define a cone
      AttributeBegin
        Translate 0 0 2.5
        Rotate -90 1 0 0
    
        #this describes the material properties
        Material "matte" "color Kd" [0.9 0.1 0.1]
    
        #this is the shape
        Shape "cone" "float radius" [.75] "float height" [2]
      AttributeEnd
    
    AttributeEnd

    如上有三对AttributeBegin/AttributeEnd,刚好也有三组仿射变换Translate/Rotate。

    第二组Translate/Rotate只作用于第二对AttributeBegin/AttributeEnd包住的sphere;
    第三组Translate/Rotate只作用于第三对AttributeBegin/AttributeEnd包住的cone;
    由于第一对AttributeBegin/AttributeEnd包住的是sphere和cone,所以,第一组Translate/Rotate对sphere和cone都起作用。

    4,对关键字后参数的解析

    4.1 关键字后直接跟参数值,直接解析,处理函数形参中顺序对应这些参数。

    举例4:

    LookAt 1 1 10   0 0 -1  0 1 0 #ex ey ez lx ly lz ux uy uz

    处理函数原型:

    void pbrtLookAt(Float ex, Float ey, Float ez, Float lx, Float ly, Float lz, Float ux, Float uy, Float uz);

    举例5:

      Translate 0 -1 0
      Rotate 35 0 1 0

    处理函数原型:

    void pbrtTranslate(Float dx, Float dy, Float dz);
    void pbrtRotate(Float angle, Float ax, Float ay, Float az);

    4.2 关键字后跟:类型+属性,其中“属性”的格式是:“属性类型 属性名称”[该名称属性对应的值]

    “属性”的格式类似于:

    float num = 3.0;

    即:类型+变量+赋值

    举例6:

    Film "image" "string filename" ["sphere.exr"]
         "integer xresolution" [200] "integer yresolution" [200]

    解析:
    关键字是Film;
    这个Film的类型是image;
    这个image类型的Film有三个属性:

    属性一:有个string类型的属性叫做filename,这个filename的值是“sphere.exr”
    属性二:有个integer类型的属性叫做xresolution,这个xresolution的值为200
    属性三:有个integer类型的属性叫做yresolution,这个yresolution的值为200

    处理函数原型:

    void pbrtFilm(const std::string &type, const ParamSet &params);

    举例7:

      LightSource "distant" 
                  "point from" [0 0 0] "point to"   [0 0 1]
                  "color L"    [3 3 3]

    解析:
    关键字是LightSource;
    这个LightSource的类型是distant;
    这个distant类型的LightSource有三个属性:

    属性一:有个point类型的属性叫做from,这个from的值为[0 0 0]
    属性二:有个point类型的属性叫做to,这个to的值为[0 0 1]
    属性三:有个color类型的属性叫做L,这个L的值为[3 3 3]

    处理函数原型:

    void pbrtLightSource(const std::string &name, const ParamSet &params);

    举例8:

        Material "uber" "color Kd" [0.1 0.1 0.9] "color Kr" [0.9 0.9 0.9] "color Ks" [0.1 0.1 0.1] "float roughness" [0.9] "float index" [1.34]

    解析:
    关键字是Material;
    这个Material的类型是uber;
    这个uber类型的Material有五个属性:

    属性一:有个color类型的属性叫做Kd,这个Kd的值为[0.1 0.1 0.9]
    属性二:有个color类型的属性叫做Kr,这个Kr的值为[0.9 0.9 0.9]
    属性三:有个color类型的属性叫做Ks,这个Ks的值为[0.1 0.1 0.1]
    属性四:有个float类型的属性叫做roughness,这个roughness的值为0.9
    属性五:有个float类型的属性叫做index,这个index的值为1.34

    处理函数原型:

    void pbrtMaterial(const std::string &name, const ParamSet &params);

    4.3 关键字后跟:类型+X+X+……+属性

    这种情况和4.2比较类似,只是在“类型”、“属性”之间加了若干其他信息。

    举例9:

    Texture "grid" "color" "imagemap" "string filename" ["textures/lines.png"]

    处理函数原型:

    void pbrtTexture(const std::string &name, const std::string &type,
                     const std::string &texname, const ParamSet &params);

    其实,所有情况都可以归到“X+X+X+属性”。
    只是,
    有的只有X+X+X;
    有的X多;
    有的X少;

    不管是哪种情况,最终都是取决于“处理函数原型”。

    ———————————————-

    “.pbrt格式解析”完毕!!!!!
    接下来的内容是“程序对.pbrt文件的处理过程”

    ———————————————-

    参考:Q111:PBRT-V3系统概述

    5,程序中解析的过程

    PBRT-V3是用第三方程序flex、bison来解析场景描述文件的。

    接下来,小编以解析LightSource为例说明一下从开始解析到存储数据的过程。

    举例10:

      LightSource "distant" 
                  "point from" [0 0 0] "point to"   [0 0 1]
                  "color L"    [3 3 3]

    在pbrtparse.y中有:

    | LIGHTSOURCE STRING paramlist
    {
        pbrt::ParamSet params;
        pbrt::InitParamSet(params, pbrt::SpectrumType::Illuminant);
        pbrt::pbrtLightSource($2, params);
        pbrt::FreeArgs();
    }

    这个是告诉flex、bison在读到关键字“LightSource”时要做的事情。

    先看这句:

        pbrt::pbrtLightSource($2, params);

    这句是最终调用处理函数pbrtLightSource(),给该函数传了两个参数:
    $2,存放的是LightSource的类型名,此处即为“distant”;
    params,存放的是这个distant类型的LightSource的所有属性。

    5.1 初始化params

    存放属性的params是一个ParamSet对象。ParamSet是在src/core/paramset.h中定义的。

    class ParamSet {
      public:
        // ParamSet Public Methods
        ParamSet() {}
        void AddFloat(const std::string &, std::unique_ptr<Float[]> v,
                      int nValues = 1);
        void AddInt(const std::string &, std::unique_ptr<int[]> v, int nValues);
        void AddBool(const std::string &, std::unique_ptr<bool[]> v, int nValues);
        void AddPoint2f(const std::string &, std::unique_ptr<Point2f[]> v,
                        int nValues);
        void AddVector2f(const std::string &, std::unique_ptr<Vector2f[]> v,
                         int nValues);
        void AddPoint3f(const std::string &, std::unique_ptr<Point3f[]> v,
                        int nValues);
        void AddVector3f(const std::string &, std::unique_ptr<Vector3f[]> v,
                         int nValues);
        void AddNormal3f(const std::string &, std::unique_ptr<Normal3f[]> v,
                         int nValues);
        void AddString(const std::string &, std::unique_ptr<std::string[]> v,
                       int nValues);
        void AddTexture(const std::string &, const std::string &);
        void AddRGBSpectrum(const std::string &, std::unique_ptr<Float[]> v,
                            int nValues);
        void AddXYZSpectrum(const std::string &, std::unique_ptr<Float[]> v,
                            int nValues);
        void AddBlackbodySpectrum(const std::string &, std::unique_ptr<Float[]> v,
                                  int nValues);
        void AddSampledSpectrumFiles(const std::string &, const char **,
                                     int nValues);
        void AddSampledSpectrum(const std::string &, std::unique_ptr<Float[]> v,
                                int nValues);
        bool EraseInt(const std::string &);
        bool EraseBool(const std::string &);
        bool EraseFloat(const std::string &);
        bool ErasePoint2f(const std::string &);
        bool EraseVector2f(const std::string &);
        bool ErasePoint3f(const std::string &);
        bool EraseVector3f(const std::string &);
        bool EraseNormal3f(const std::string &);
        bool EraseSpectrum(const std::string &);
        bool EraseString(const std::string &);
        bool EraseTexture(const std::string &);
        Float FindOneFloat(const std::string &, Float d) const;
        int FindOneInt(const std::string &, int d) const;
        bool FindOneBool(const std::string &, bool d) const;
        Point2f FindOnePoint2f(const std::string &, const Point2f &d) const;
        Vector2f FindOneVector2f(const std::string &, const Vector2f &d) const;
        Point3f FindOnePoint3f(const std::string &, const Point3f &d) const;
        Vector3f FindOneVector3f(const std::string &, const Vector3f &d) const;
        Normal3f FindOneNormal3f(const std::string &, const Normal3f &d) const;
        Spectrum FindOneSpectrum(const std::string &, const Spectrum &d) const;
        std::string FindOneString(const std::string &, const std::string &d) const;
        std::string FindOneFilename(const std::string &,
                                    const std::string &d) const;
        std::string FindTexture(const std::string &) const;
        const Float *FindFloat(const std::string &, int *n) const;
        const int *FindInt(const std::string &, int *nValues) const;
        const bool *FindBool(const std::string &, int *nValues) const;
        const Point2f *FindPoint2f(const std::string &, int *nValues) const;
        const Vector2f *FindVector2f(const std::string &, int *nValues) const;
        const Point3f *FindPoint3f(const std::string &, int *nValues) const;
        const Vector3f *FindVector3f(const std::string &, int *nValues) const;
        const Normal3f *FindNormal3f(const std::string &, int *nValues) const;
        const Spectrum *FindSpectrum(const std::string &, int *nValues) const;
        const std::string *FindString(const std::string &, int *nValues) const;
        void ReportUnused() const;
        void Clear();
        std::string ToString() const;
        void Print(int indent) const;
    
      private:
        // ParamSet Private Data
        std::vector<std::shared_ptr<ParamSetItem<bool>>> bools;
        std::vector<std::shared_ptr<ParamSetItem<int>>> ints;
        std::vector<std::shared_ptr<ParamSetItem<Float>>> floats;
        std::vector<std::shared_ptr<ParamSetItem<Point2f>>> point2fs;
        std::vector<std::shared_ptr<ParamSetItem<Vector2f>>> vector2fs;
        std::vector<std::shared_ptr<ParamSetItem<Point3f>>> point3fs;
        std::vector<std::shared_ptr<ParamSetItem<Vector3f>>> vector3fs;
        std::vector<std::shared_ptr<ParamSetItem<Normal3f>>> normals;
        std::vector<std::shared_ptr<ParamSetItem<Spectrum>>> spectra;
        std::vector<std::shared_ptr<ParamSetItem<std::string>>> strings;
        std::vector<std::shared_ptr<ParamSetItem<std::string>>> textures;
        static std::map<std::string, Spectrum> cachedSpectra;
    };
    

    ParamSet的定义看起来蛮复杂的,其实就干四件事(有点类似于数据库及对数据的CRUD):

    > 其一:定义了存放各种属性类型数据的容器;比如:bools, ints, floats, spectra, strings等等。
    > 其二:对各类容器进行添加数据;
    > 其三:对各类容器进行删除数据;
    > 其四:在各类容器查找数据;(这里注意一下,是根据“属性名称”进行查找的)
    

    接下来,看看具体是怎么为params填充数据的,调用的是这个函数:

        pbrt::InitParamSet(params, pbrt::SpectrumType::Illuminant);

    在partparse.y中有这么一段code,“定义”了所有“属性类型”:

             TRY_DECODING_TYPE("float",     PARAM_TYPE_FLOAT)
        else TRY_DECODING_TYPE("integer",   PARAM_TYPE_INT)
        else TRY_DECODING_TYPE("bool",      PARAM_TYPE_BOOL)
        else TRY_DECODING_TYPE("point2",    PARAM_TYPE_POINT2)
        else TRY_DECODING_TYPE("vector2",   PARAM_TYPE_VECTOR2)
        else TRY_DECODING_TYPE("point3",    PARAM_TYPE_POINT3)
        else TRY_DECODING_TYPE("vector3",   PARAM_TYPE_VECTOR3)
        else TRY_DECODING_TYPE("point",     PARAM_TYPE_POINT3)
        else TRY_DECODING_TYPE("vector",    PARAM_TYPE_VECTOR3)
        else TRY_DECODING_TYPE("normal",    PARAM_TYPE_NORMAL)
        else TRY_DECODING_TYPE("string",    PARAM_TYPE_STRING)
        else TRY_DECODING_TYPE("texture",   PARAM_TYPE_TEXTURE)
        else TRY_DECODING_TYPE("color",     PARAM_TYPE_RGB)
        else TRY_DECODING_TYPE("rgb",       PARAM_TYPE_RGB)
        else TRY_DECODING_TYPE("xyz",       PARAM_TYPE_XYZ)
        else TRY_DECODING_TYPE("blackbody", PARAM_TYPE_BLACKBODY)
        else TRY_DECODING_TYPE("spectrum",  PARAM_TYPE_SPECTRUM)

    然后,在InitParamSet()中会根据属性类型调用ParamSet对应的成员函数来给params填充数据。

    对于:

      LightSource "distant" 
                  "point from" [0 0 0] "point to"   [0 0 1]
                  "color L"    [3 3 3]

    就会调用到:

        void AddPoint3f(const std::string &, std::unique_ptr<Point3f[]> v, int nValues);
        void AddRGBSpectrum(const std::string &, std::unique_ptr<Float[]> v, int nValues);

    具体实现在paramset.cpp中:

    void ParamSet::AddPoint3f(const std::string &name,
                              std::unique_ptr<Point3f[]> values, int nValues) {
        ErasePoint3f(name);
        ADD_PARAM_TYPE(Point3f, point3fs);
    }
    void ParamSet::AddRGBSpectrum(const std::string &name,
                                  std::unique_ptr<Float[]> values, int nValues) {
        EraseSpectrum(name);
        CHECK_EQ(nValues % 3, 0);
        nValues /= 3;
        std::unique_ptr<Spectrum[]> s(new Spectrum[nValues]);
        for (int i = 0; i < nValues; ++i) s[i] = Spectrum::FromRGB(&values[3 * i]);
        std::shared_ptr<ParamSetItem<Spectrum>> psi(
            new ParamSetItem<Spectrum>(name, std::move(s), nValues));
        spectra.push_back(psi);
    }

    5.2 pbrtLightSource()

    pbrtLightSource将数据写入渲染内存中。

    void pbrtLightSource(const std::string &name, const ParamSet &params) {
        VERIFY_WORLD("LightSource");
        WARN_IF_ANIMATED_TRANSFORM("LightSource");
        MediumInterface mi = graphicsState.CreateMediumInterface();
        std::shared_ptr<Light> lt = MakeLight(name, params, curTransform[0], mi);
        if (!lt)
            Error("LightSource: light type \"%s\" unknown.", name.c_str());
        else
            renderOptions->lights.push_back(lt);
        if (PbrtOptions.cat || PbrtOptions.toPly) {
            printf("%*sLightSource \"%s\" ", catIndentCount, "", name.c_str());
            params.Print(catIndentCount);
            printf("\n");
        }
    }

    这个函数在src/core/api.cpp中。
    完成将LightSource的数据写入renderOptions->lights中。

    渲染相关的数据都是存在renderOptions中的。

    renderOptions的类是长这个样子:

    struct RenderOptions {
        // RenderOptions Public Methods
        Integrator *MakeIntegrator() const;
        Scene *MakeScene();
        Camera *MakeCamera() const;
    
        // RenderOptions Public Data
        Float transformStartTime = 0, transformEndTime = 1;
        std::string FilterName = "box";
        ParamSet FilterParams;
        std::string FilmName = "image";
        ParamSet FilmParams;
        std::string SamplerName = "halton";
        ParamSet SamplerParams;
        std::string AcceleratorName = "bvh";
        ParamSet AcceleratorParams;
        std::string IntegratorName = "path";
        ParamSet IntegratorParams;
        std::string CameraName = "perspective";
        ParamSet CameraParams;
        TransformSet CameraToWorld;
        std::map<std::string, std::shared_ptr<Medium>> namedMedia;
        std::vector<std::shared_ptr<Light>> lights;
        std::vector<std::shared_ptr<Primitive>> primitives;
        std::map<std::string, std::vector<std::shared_ptr<Primitive>>> instances;
        std::vector<std::shared_ptr<Primitive>> *currentInstance = nullptr;
        bool haveScatteringMedia = false;
    };

    简单说来,
    程序外,描述场景的是.pbrt格式的文件;
    程序内,描述场景的是RenderOptions对象;

    另外,注意一下,对于LightSource,pbrtLightSource()直接调用了MakeLight()创建了LightSource对象。
    所以,renderOptions->lights中保存的是LightSource对象的指针。

    而像RenderOptions中的这些:

        std::string FilterName = "box";
        ParamSet FilterParams;
        std::string FilmName = "image";
        ParamSet FilmParams;
        std::string SamplerName = "halton";
        ParamSet SamplerParams;
        std::string AcceleratorName = "bvh";
        ParamSet AcceleratorParams;
        std::string IntegratorName = "path";
        ParamSet IntegratorParams;
        std::string CameraName = "perspective";
        ParamSet CameraParams;
        TransformSet CameraToWorld;

    对应的“pbrt关键字”函数中只是将相关属性参数存入RenderOptions的对应成员变量中。

    注意到:
    在RenderOptions类定义的前面有几个成员方法:

        Integrator *MakeIntegrator() const;
        Scene *MakeScene();
        Camera *MakeCamera() const;

    这个就是用来创建那些还没有在对应“pbrt关键字”函数中创建对象的类的对象的。

    6,pbrtWorldEnd()

    最后处理关键字“WorldEnd”。
    在pbrtWorldEnd()有非常重要的三行代码:

            std::unique_ptr<Integrator> integrator(renderOptions->MakeIntegrator());
            std::unique_ptr<Scene> scene(renderOptions->MakeScene());
    
    
    
            if (scene && integrator) integrator->Render(*scene);

    1,MakeIntegrator()
    2,MakeScene()
    3,integrator->Render(*scene)

    即:
    创建积分器;创建场景;用积分器渲染场景;

    重点提一下MakeScene()。

    创建Scene对象。
    之前小编一直搞不清RenderOption对象和Scene对象的关系:
    RenderOption侧重数据,直接和场景描述对应;
    Scene是将RenderOption的数据再封装了一下,同时加入了和渲染相关的方法。

    贴出Scene的定义代码:

    // Scene Declarations
    class Scene {
      public:
        // Scene Public Methods
        Scene(std::shared_ptr<Primitive> aggregate,
              const std::vector<std::shared_ptr<Light>> &lights)
            : lights(lights), aggregate(aggregate) {
            // Scene Constructor Implementation
            worldBound = aggregate->WorldBound();
            for (const auto &light : lights) {
                light->Preprocess(*this);
                if (light->flags & (int)LightFlags::Infinite)
                    infiniteLights.push_back(light);
            }
        }
        const Bounds3f &WorldBound() const { return worldBound; }
        bool Intersect(const Ray &ray, SurfaceInteraction *isect) const;
        bool IntersectP(const Ray &ray) const;
        bool IntersectTr(Ray ray, Sampler &sampler, SurfaceInteraction *isect,
                         Spectrum *transmittance) const;
    
        // Scene Public Data
        std::vector<std::shared_ptr<Light>> lights;
        // Store infinite light sources separately for cases where we only want
        // to loop over them.
        std::vector<std::shared_ptr<Light>> infiniteLights;
    
      private:
        // Scene Private Data
        std::shared_ptr<Primitive> aggregate;
        Bounds3f worldBound;
    };

    场景描述文件解析结束时得到两样东西:
    一个积分器对象;
    一个场景对象;

    然后,开始用“积分器对象”渲染“场景对象”。

    展开全文
  • TU Wien Rendering/Ray Tracing Course,图形学课程课件,第五章
  • PBRT第二版2

    2014-11-07 17:55:26
    该书所描述的pbrt是基于光线追踪算法的物理学渲染系统。其它相关的书籍只是介绍原理,算法,或许还夹杂些少许源代码。该书则不同,因为它带了一个完全能工作的完备的渲染系统。(正是这个原因,有很多人用这个系统为...
  • PBRT的程序运行流程

    2020-12-08 20:40:58
    pbrt ../Scenes/material-testball/scene.pbrt 即可开始进行渲染。定位程序到pbrt.cpp:main函数为执行入口。 一开始初始化google工具,我也不知道有什么用处。然后接下来就是对输入的字符串进行比较,有一些...

    PBRT作为一个比较完备和轻量级引擎,里面有很多细节和实现步骤我们都很难短时间掌握。因此,我决定写一系列的小书,来实现一个低级光追渲染引擎到PBRT的过渡实现。这个系列的小书不会去讲解和实现那些比较独特的内容,例如真实感相机等,而是对PBRT的主流渲染管线从细节到移植改编的实现。

    光线追踪最好的入门系列之一是光追三部曲,这三本书可以让你短时间内就能拥有一个自己编写的光线追踪引擎,但是其完备性和鲁棒性都不够,可以用来渲染的场景也有限。而即使这三本小书学透了,再去学习PBRT[1]源码也会面临诸多困难,而PBRT[1]这本书的讲解结构也是非常松散的,不利于马上动手去实现。因此,我们的任务目标是在光追三部曲的基础上,从整体到细节去把握PBRT,直到把PBRT应用到我们自己的光线追踪引擎上去。

    之所以选择的高级引擎书籍是PBRT,因为其代码只有不到三万行,跟我自己写的第一个比较完整的渲染引擎,一个医学数据渲染引擎(如下图)的代码量差不多,因此我感觉能对如何介绍里面的知识相对容易把握一些。

    本系列的小书:《图形学C++必备参考资料》,《PBRT文件加载和设定》,《PBRT代码实战-从简单的引擎扩展到PBRT路径追踪引擎》……

    在写这本书的时候,我其实是比较忐忑的。我一直在想,对于一个初学者而言,应该怎么去面对一个比较庞大而且复杂的引擎架构呢,以及,他们想看到一本什么样的书呢。为此我咨询了一些初学者,可以说,本书是一边写,一边向大家求得反馈而形成的。

    PBRT是一个轻量级的系统,但仍然里面有比较复杂的逻辑结构划分,因此,本书作为PBRT解读系列的第一本书(也可以说《图形学C++必备参考资料》是第一本,这两本书是相辅相成的),意在能够让读者在有一定基础中快速把握整个PBRT系统,知道场景如何加载的,以及加载到了各个基类的什么位置,这样再研究该系统的话就会更轻松。

    本书的售价是6元(电子版),但是并不直接收取费用。如果您免费得到了这本书的电子版,在学习和实现时觉得有用,可以往我们的支付宝账户(17853140351,备注:PBRT文件加载和设定)支持6元,您的赞助将是我们Dezeming Family继续创作各种图形学、机器学习、以及数学原理小册子的动力!

    写完后我会在第一时间发布:

    https://dezeming.top/

    展开全文
  • PBRT创作并显示一个康奈尔盒

    千次阅读 2021-01-17 17:35:35
    PBRT源码解读见PBRT源码解读 首先是完整的源码: Integrator "path" "integer maxdepth" [ 5 ] LookAt 0 1 5 0 1 0 0 1 0 Sampler "sobol" "integer pixelsamples" [ 4 ] PixelFilter "triangle" "float xwidth...

    PBRT源码解读 见 PBRT源码解读

    首先是完整的源码:

    Integrator "path" "integer maxdepth" [ 5 ] 
    LookAt 0 1 5   0 1 0  0 1 0
    Sampler "sobol" "integer pixelsamples" [ 4 ] 
    PixelFilter "triangle" "float xwidth" [ 1.000000 ] "float ywidth" [ 1.000000 ] 
    Film "image" "integer xresolution" [ 512 ] "integer yresolution" [ 512 ] "string filename" [ "cornellBox.png" ] 
    Camera "perspective" "float fov" [ 28.500000 ] 
    WorldBegin
    
    	MakeNamedMaterial "LeftWall" "string type" [ "matte" ] "rgb Kd" [ 0.630000 0.065000 0.050000 ] 
    	MakeNamedMaterial "RightWall" "string type" [ "matte" ] "rgb Kd" [ 0.140000 0.450000 0.091000 ] 
    	MakeNamedMaterial "Floor" "string type" [ "matte" ] "rgb Kd" [ 0.725000 0.710000 0.680000 ] 
    	MakeNamedMaterial "Ceiling" "string type" [ "matte" ] "rgb Kd" [ 0.725000 0.710000 0.680000 ] 
    	MakeNamedMaterial "BackWall" "string type" [ "matte" ] "rgb Kd" [ 0.725000 0.710000 0.680000 ] 
    	MakeNamedMaterial "ShortBox" "string type" [ "matte" ] "rgb Kd" [ 0.725000 0.710000 0.680000 ] 
    	MakeNamedMaterial "TallBox" "string type" [ "matte" ] "rgb Kd" [ 0.725000 0.710000 0.680000 ] 
    	MakeNamedMaterial "Light" "string type" [ "matte" ] "rgb Kd" [ 0.000000 0.000000 0.000000 ] 
    
    	NamedMaterial "Floor" 
    	Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ -1 0 -1 -1 0 1 1 0 1 1 0 -1 ] "normal N" [ 0 1 0 0 1 0 0 1 0 0 1 0 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    	NamedMaterial "Ceiling" 
    	Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ 1 2 1 -1 2 1 -1 2 -1 1 2 -1 ] "normal N" [ 0 -1 0 0 -1 0 0 -1 0 0 -1 0 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    	NamedMaterial "BackWall" 
    	Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ -1 0 -1 -1 2 -1 1 2 -1 1 0 -1 ] "normal N" [ 0 0 -1 0 0 -1 0 0 -1 0 0 -1 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    	NamedMaterial "RightWall" 
    	Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ 1 0 -1 1 2 -1 1 2 1 1 0 1 ] "normal N" [ 1 0 0 1 0 0 1 0 0 1 0 0 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    	NamedMaterial "LeftWall" 
    	Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ -1 0 1 -1 2 1 -1 2 -1 -1 0 -1 ] "normal N" [ -1 0 0 -1 0 0 -1 0 0 -1 0 0 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    
    	NamedMaterial "ShortBox" 
    	Shape "trianglemesh" "integer indices" [ 0 2 1 0 3 2 4 6 5 4 7 6 8 10 9 8 11 10 12 14 13 12 15 14 16 18 17 16 19 18 20 22 21 20 23 22 ] "point P" [ -0.0460751 0.6 0.573007 -0.0460751 -2.98023e-008 0.573007 0.124253 0 0.00310463 0.124253 0.6 0.00310463 0.533009 0 0.746079 0.533009 0.6 0.746079 0.703337 0.6 0.176177 0.703337 2.98023e-008 0.176177 0.533009 0.6 0.746079 -0.0460751 0.6 0.573007 0.124253 0.6 0.00310463 0.703337 0.6 0.176177 0.703337 2.98023e-008 0.176177 0.124253 0 0.00310463 -0.0460751 -2.98023e-008 0.573007 0.533009 0 0.746079 0.533009 0 0.746079 -0.0460751 -2.98023e-008 0.573007 -0.0460751 0.6 0.573007 0.533009 0.6 0.746079 0.703337 0.6 0.176177 0.124253 0.6 0.00310463 0.124253 0 0.00310463 0.703337 2.98023e-008 0.176177 ] "normal N" [ -0.958123 -4.18809e-008 -0.286357 -0.958123 -4.18809e-008 -0.286357 -0.958123 -4.18809e-008 -0.286357 -0.958123 -4.18809e-008 -0.286357 0.958123 4.18809e-008 0.286357 0.958123 4.18809e-008 0.286357 0.958123 4.18809e-008 0.286357 0.958123 4.18809e-008 0.286357 -4.37114e-008 1 -1.91069e-015 -4.37114e-008 1 -1.91069e-015 -4.37114e-008 1 -1.91069e-015 -4.37114e-008 1 -1.91069e-015 4.37114e-008 -1 1.91069e-015 4.37114e-008 -1 1.91069e-015 4.37114e-008 -1 1.91069e-015 4.37114e-008 -1 1.91069e-015 -0.286357 -1.25171e-008 0.958123 -0.286357 -1.25171e-008 0.958123 -0.286357 -1.25171e-008 0.958123 -0.286357 -1.25171e-008 0.958123 0.286357 1.25171e-008 -0.958123 0.286357 1.25171e-008 -0.958123 0.286357 1.25171e-008 -0.958123 0.286357 1.25171e-008 -0.958123 ] "float uv" [ 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 ] 
    	NamedMaterial "TallBox" 
    	Shape "trianglemesh" "integer indices" [ 0 2 1 0 3 2 4 6 5 4 7 6 8 10 9 8 11 10 12 14 13 12 15 14 16 18 17 16 19 18 20 22 21 20 23 22 ] "point P" [ -0.720444 1.2 -0.473882 -0.720444 0 -0.473882 -0.146892 0 -0.673479 -0.146892 1.2 -0.673479 -0.523986 0 0.0906493 -0.523986 1.2 0.0906492 0.0495656 1.2 -0.108948 0.0495656 0 -0.108948 -0.523986 1.2 0.0906492 -0.720444 1.2 -0.473882 -0.146892 1.2 -0.673479 0.0495656 1.2 -0.108948 0.0495656 0 -0.108948 -0.146892 0 -0.673479 -0.720444 0 -0.473882 -0.523986 0 0.0906493 -0.523986 0 0.0906493 -0.720444 0 -0.473882 -0.720444 1.2 -0.473882 -0.523986 1.2 0.0906492 0.0495656 1.2 -0.108948 -0.146892 1.2 -0.673479 -0.146892 0 -0.673479 0.0495656 0 -0.108948 ] "normal N" [ -0.328669 -4.1283e-008 -0.944445 -0.328669 -4.1283e-008 -0.944445 -0.328669 -4.1283e-008 -0.944445 -0.328669 -4.1283e-008 -0.944445 0.328669 4.1283e-008 0.944445 0.328669 4.1283e-008 0.944445 0.328669 4.1283e-008 0.944445 0.328669 4.1283e-008 0.944445 3.82137e-015 1 -4.37114e-008 3.82137e-015 1 -4.37114e-008 3.82137e-015 1 -4.37114e-008 3.82137e-015 1 -4.37114e-008 -3.82137e-015 -1 4.37114e-008 -3.82137e-015 -1 4.37114e-008 -3.82137e-015 -1 4.37114e-008 -3.82137e-015 -1 4.37114e-008 -0.944445 1.43666e-008 0.328669 -0.944445 1.43666e-008 0.328669 -0.944445 1.43666e-008 0.328669 -0.944445 1.43666e-008 0.328669 0.944445 -1.43666e-008 -0.328669 0.944445 -1.43666e-008 -0.328669 0.944445 -1.43666e-008 -0.328669 0.944445 -1.43666e-008 -0.328669 ] "float uv" [ 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 ] 
    
    	AttributeBegin
    		AreaLightSource "diffuse" "rgb L" [ 17.000000 17.000000 17.000000 ] 
    		NamedMaterial "Light" 
    		Shape "trianglemesh" "integer indices" [ 0 1 2 0 2 3 ] "point P" [ -0.24 1.98 -0.22 0.23 1.98 -0.22 0.23 1.98 0.16 -0.24 1.98 0.16 ] "normal N" [ -8.74228e-008 -1 1.86006e-007 -8.74228e-008 -1 1.86006e-007 -8.74228e-008 -1 1.86006e-007 -8.74228e-008 -1 1.86006e-007 ] "float uv" [ 0 0 1 0 1 1 0 1 ] 
    	AttributeEnd
    
    WorldEnd

    源码很简单,我们的视点在(0 1 5)坐标上,看向(0 1 0)位置,up向量是(0 1 0)。

    采用透视相机,视野角为28.5。

    对于场景的每个面片,采用点索引和点位置表示:

    "integer indices" [ 0 1 2 0 2 3 ] "point P" [ -1 0 -1 -1 0 1 1 0 1 1 0 -1 ]

    点的位置都是计算好的,也不需要额外的面片模型文件。

    渲染结果:

    设置的渲染"integer maxdepth"和"integer pixelsamples"高一些,可以得到:

     

    展开全文
  • NULL 博文链接:https://netalpha.iteye.com/blog/603728
  • 如何阅读PBRT3?

    2021-04-11 16:07:40
    不知道以怎样的姿势阅读才是正确的,以目前的进度来看,发现尤其是1.3对pbrt的概述那一节读的很混乱,好多类和方法就这么突然告诉你,并不知道到底是怎么回事。 我知道后面都详细的讲到了,但是不知道到底有没有...
  • PBRT笔记(9)——贴图

    2019-03-20 10:15:00
    pbrt遵循sRGB标准,该标准规定了一条特定的曲线来匹配CRT显示器的显示。sRGB gamma曲线是一个分段函数,其低值为线性项,其大中型值为幂项。 \(\gamma= \left\{ \begin{array}{cc} 12.92x, & x\leq 0.0031308\\ 0, &...
  • PBRT并行化研究

    2020-09-24 08:56:35
    PBRT是由Matt Pharr 和Greg Humphreys完成的一个经典的光线追踪程序,它十分注重于光线追踪算法的效率。而光线追踪算法的一个最大的难点就是其性 能问题,算法中需要对每个像素点进行光线的反向追踪,并且反向追踪...
  • pbrt读书笔记

    2018-11-01 21:41:51
    这是物理渲染的几个基本特征,其中最重要的就是线性和能量守恒。     ...w表示的点集合,而fai表示的是通量,把通量除以面积,就是光强,也就是通量密度。...最后的辐射度,还要考虑dA,因为是斜射,所以还要考虑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 774
精华内容 309
关键字:

pbrt