Dandelion
2.0.0
A light-weight 3D builder for educational usage
Toggle main menu visibility
载入中...
搜索中...
未找到
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
21
class
RasterizerRenderer
;
22
class
WhittedRenderer
;
23
24
/*!
25
* \ingroup rendering
26
* \~chinese
27
* \brief 可用的渲染器类型
28
*/
29
enum class
RendererType
30
{
31
RASTERIZER,
32
// RASTERIZER_MT,
33
WHITTED_STYLE
34
};
35
36
/*!
37
* \ingroup rendering
38
* \~chinese
39
* \brief 离线渲染的执行入口
40
*/
41
class
RenderEngine
42
{
43
public
:
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使用多线程时的线程数设置 */
52
int
n_threads
;
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
*/
79
class
RasterizerRenderer
80
{
81
public
:
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
108
private
:
109
110
std::shared_ptr<spdlog::logger> logger;
111
};
112
113
/*!
114
* \ingroup rendering
115
* \~chinese
116
* \brief 实现 Whitted-Style 光线追踪管线。
117
*/
118
class
WhittedRenderer
119
{
120
public
:
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 进行加速*/
131
bool
use_bvh
;
132
std::vector<unsigned char>& rendering_res;
133
134
private
:
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
FragmentProcessor
负责执行片元着色器的工作线程。
定义
rasterizer_renderer.h:71
RasterizerRenderer
实现光栅化渲染管线。
定义
render_engine.h:80
RasterizerRenderer::render
void render(const Scene &scene)
定义
rasterizer_renderer.cpp:69
Rasterizer
光栅化器
定义
rasterizer.h:25
RenderEngine
离线渲染的执行入口
定义
render_engine.h:42
RenderEngine::n_threads
int n_threads
定义
render_engine.h:52
RenderEngine::background_color
static Eigen::Vector3f background_color
定义
render_engine.h:66
RenderEngine::whitted_render
std::unique_ptr< WhittedRenderer > whitted_render
定义
render_engine.h:71
RenderEngine::rendering_res
std::vector< unsigned char > rendering_res
定义
render_engine.h:48
RenderEngine::render
void render(Scene &scene, RendererType type)
离线渲染入口,负责调用渲染器的渲染函数
定义
render_engine.cpp:18
RenderEngine::width
float width
定义
render_engine.h:50
RenderEngine::rasterizer_render
std::unique_ptr< RasterizerRenderer > rasterizer_render
定义
render_engine.h:69
Scene
表示一个包含相机、光源、物体等对象的完整场景。
定义
scene.h:57
VertexProcessor
负责执行顶点着色器的工作线程。
定义
rasterizer_renderer.h:27
WhittedRenderer
实现 Whitted-Style 光线追踪管线。
定义
render_engine.h:119
WhittedRenderer::cast_ray
Eigen::Vector3f cast_ray(const Ray &ray, const Scene &scene, int depth)
追踪指定光线得到颜色
定义
whitted_renderer.cpp:158
WhittedRenderer::render
void render(Scene &scene)
定义
whitted_renderer.cpp:62
WhittedRenderer::use_bvh
bool use_bvh
定义
render_engine.h:131
WhittedRenderer::fresnel
float fresnel(const Eigen::Vector3f &I, const Eigen::Vector3f &N, const float &ior)
菲涅尔方程根据观察角度计算反射光线的所占百分比
定义
whitted_renderer.cpp:102
WhittedRenderer::mirror_threshold
static constexpr float mirror_threshold
定义
render_engine.h:126
WhittedRenderer::trace
std::optional< std::tuple< Intersection, PhongMaterial > > trace(const Ray &ray, const Scene &scene)
追踪光线与场景中物体的相交情况
定义
whitted_renderer.cpp:122
RendererType
RendererType
可用的渲染器类型
定义
render_engine.h:30
rasterizer.h
光栅化渲染器中光栅化阶段的实现。
rasterizer_renderer.h
光栅化渲染器中顶点处理、片元处理两个阶段的实现。
scene.h
包含场景的类。
Ray
定义
ray.h:24
src
render
render_engine.h
制作者
1.18.0