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