Dandelion 2.0.0
A light-weight 3D builder for educational usage
载入中...
搜索中...
未找到
render_engine.h
浏览该文件的文档.
1#ifndef DANDELION_RENDER_RENDER_ENGINE_H
2#define DANDELION_RENDER_RENDER_ENGINE_H
3
4#include <memory>
5
6#include <Eigen/Core>
7#include <Eigen/Geometry>
8#include <spdlog/spdlog.h>
9
10#include "../scene/scene.h"
11#include "rasterizer.h"
12#include "rasterizer_renderer.h"
13
14/*!
15 * \file render/render_engine.h
16 * \ingroup rendering
17 * \~chinese
18 * \brief 定义了渲染引擎和渲染器。
19 */
20
22class WhittedRenderer;
23
24/*!
25 * \ingroup rendering
26 * \~chinese
27 * \brief 可用的渲染器类型
28 */
29enum class RendererType
30{
31 RASTERIZER,
32 // RASTERIZER_MT,
33 WHITTED_STYLE
34};
35
36/*!
37 * \ingroup rendering
38 * \~chinese
39 * \brief 离线渲染的执行入口
40 */
41class RenderEngine
42{
43public:
44
45 RenderEngine();
46
47 /*! \~chinese 渲染的结果(以无符号字符型变量进行存储)*/
48 std::vector<unsigned char> rendering_res;
49 /*! \~chinese 根据aspect_ratio对渲染出图片的长和宽进行设置 */
50 float width, height;
51 /*! \~chinese whitted_style renderer使用多线程时的线程数设置 */
53
54 /*!
55 * \~chinese
56 * \brief 离线渲染入口,负责调用渲染器的渲染函数
57 *
58 * 可以选择不同的渲染方式,在设置好场景之后,执行该函数能够得到
59 * 使用选定方式对当前场景的渲染结果
60 *
61 * \param scene 场景
62 * \param type 渲染器类型
63 */
64 void render(Scene& scene, RendererType type);
65 /*! \~chinese 渲染结果预览的背景颜色 */
66 static Eigen::Vector3f background_color;
67
68 /*! \~chinese 光栅化渲染器 */
69 std::unique_ptr<RasterizerRenderer> rasterizer_render;
70 /*! \~chinese whitted style渲染器 */
71 std::unique_ptr<WhittedRenderer> whitted_render;
72};
73
74/*!
75 * \ingroup rendering
76 * \~chinese
77 * \brief 实现光栅化渲染管线。
78 */
79class RasterizerRenderer
80{
81public:
82
83 RasterizerRenderer(
84 RenderEngine& engine, int num_vertex_threads, int num_rasterizer_threads,
85 int num_fragment_threads
86 );
87
88 /*! \~chinese 光栅化渲染器的渲染调用接口*/
89 void render(const Scene& scene);
90
91 float& width;
92 float& height;
93 int n_vertex_threads;
94 int n_rasterizer_threads;
95 int n_fragment_threads;
96
97 // initialize vertex processor
98 VertexProcessor vertex_processor;
99
100 // initialize rasterizer
101 Rasterizer rasterizer;
102
103 // initialize fragment processor
104 FragmentProcessor fragment_processor;
105
106 std::vector<unsigned char>& rendering_res;
107
108private:
109
110 std::shared_ptr<spdlog::logger> logger;
111};
112
113/*!
114 * \ingroup rendering
115 * \~chinese
116 * \brief 实现 Whitted-Style 光线追踪管线。
117 */
118class WhittedRenderer
119{
120public:
121
122 WhittedRenderer(RenderEngine& engine);
123 /*! \~chinese whitted-style 渲染器的渲染调用接口 */
124 void render(Scene& scene);
125 /*! \~chinese 镜面反射的阈值 */
126 static constexpr float mirror_threshold = 1000.0f;
127 float& width;
128 float& height;
129 int& n_threads;
130 /*! \~chinese 是否使用 BVH 进行加速*/
132 std::vector<unsigned char>& rendering_res;
133
134private:
135
136 /*!
137 * \~chinese
138 * \brief 菲涅尔方程根据观察角度计算反射光线的所占百分比
139 *
140 * \param I 入射光方向
141 * \param N 法线向量
142 * \param ior 当前反射介质的折射率
143 *
144 */
145 float fresnel(const Eigen::Vector3f& I, const Eigen::Vector3f& N, const float& ior);
146
147 /*!
148 * \~chinese
149 * \brief 追踪光线与场景中物体的相交情况
150 *
151 * 遍历场景中的所有物体,找到与光线最近的相交点,并返回相交信息和物体材质信息;
152 * 根据`use_bvh`决定是否使用 BVH 进行加速求交
153 *
154 * \param ray 待检测的光线
155 * \param scene 当前渲染的场景
156 *
157 * \returns 如果相交,返回包含相交信息和物体材质的元组;如果不相交,返回`std::nullopt`
158 */
159 std::optional<std::tuple<Intersection, PhongMaterial>>
160 trace(const Ray& ray, const Scene& scene);
161
162 /*!
163 * \~chinese
164 * \brief 追踪指定光线得到颜色
165 *
166 * \param ray 当前追踪的光线
167 * \param scene 当前渲染的场景
168 * \param depth 最大反射次数
169 */
170 Eigen::Vector3f cast_ray(const Ray& ray, const Scene& scene, int depth);
171 std::shared_ptr<spdlog::logger> logger;
172};
173
174#endif // DANDELION_RENDER_RENDER_ENGINE_H
负责执行片元着色器的工作线程。
定义 rasterizer_renderer.h:71
实现光栅化渲染管线。
定义 render_engine.h:80
void render(const Scene &scene)
定义 rasterizer_renderer.cpp:69
光栅化器
定义 rasterizer.h:25
离线渲染的执行入口
定义 render_engine.h:42
int n_threads
定义 render_engine.h:52
static Eigen::Vector3f background_color
定义 render_engine.h:66
std::unique_ptr< WhittedRenderer > whitted_render
定义 render_engine.h:71
std::vector< unsigned char > rendering_res
定义 render_engine.h:48
void render(Scene &scene, RendererType type)
离线渲染入口,负责调用渲染器的渲染函数
定义 render_engine.cpp:18
float width
定义 render_engine.h:50
std::unique_ptr< RasterizerRenderer > rasterizer_render
定义 render_engine.h:69
表示一个包含相机、光源、物体等对象的完整场景。
定义 scene.h:57
负责执行顶点着色器的工作线程。
定义 rasterizer_renderer.h:27
实现 Whitted-Style 光线追踪管线。
定义 render_engine.h:119
Eigen::Vector3f cast_ray(const Ray &ray, const Scene &scene, int depth)
追踪指定光线得到颜色
定义 whitted_renderer.cpp:158
void render(Scene &scene)
定义 whitted_renderer.cpp:62
bool use_bvh
定义 render_engine.h:131
float fresnel(const Eigen::Vector3f &I, const Eigen::Vector3f &N, const float &ior)
菲涅尔方程根据观察角度计算反射光线的所占百分比
定义 whitted_renderer.cpp:102
static constexpr float mirror_threshold
定义 render_engine.h:126
std::optional< std::tuple< Intersection, PhongMaterial > > trace(const Ray &ray, const Scene &scene)
追踪光线与场景中物体的相交情况
定义 whitted_renderer.cpp:122
RendererType
可用的渲染器类型
定义 render_engine.h:30
光栅化渲染器中光栅化阶段的实现。
光栅化渲染器中顶点处理、片元处理两个阶段的实现。
包含场景的类。
定义 ray.h:24