Dandelion 1.1.1
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 RenderEngine();
48
49 /*! \~chinese 渲染的结果(以无符号字符型变量进行存储)*/
50 std::vector<unsigned char> rendering_res;
51 /*! \~chinese 根据aspect_ratio对渲染出图片的长和宽进行设置 */
52 float width, height;
53 /*! \~chinese whitted_style renderer使用多线程时的线程数设置 */
55
56 /*!
57 * \~chinese
58 * \brief 离线渲染入口,负责调用渲染器的渲染函数
59 *
60 * 可以选择不同的渲染方式,在设置好场景之后,执行该函数能够得到
61 * 使用选定方式对当前场景的渲染结果
62 *
63 * \param scene 场景
64 * \param type 渲染器类型
65 */
66 void render(Scene& scene, RendererType type);
67 /*! \~chinese 渲染结果预览的背景颜色 */
68 static Eigen::Vector3f background_color;
69
70 /*! \~chinese 光栅化渲染器 */
71 std::unique_ptr<RasterizerRenderer> rasterizer_render;
72 /*! \~chinese whitted style渲染器 */
73 std::unique_ptr<WhittedRenderer> whitted_render;
74};
75
76/*!
77 * \ingroup rendering
78 * \~chinese
79 * \brief 实现光栅化渲染管线。
80 */
81class RasterizerRenderer
82{
83public:
84 RasterizerRenderer(RenderEngine& engine, int num_vertex_threads, int num_rasterizer_threads,
85 int num_fragment_threads);
86
87 /*! \~chinese 光栅化渲染器的渲染调用接口*/
88 void render(const Scene& scene);
89
90 /*! \~chinese 多线程光栅化渲染器的渲染调用接口*/
91 // void render_mt(const Scene& scene);
92 float& width;
93 float& height;
94 int n_vertex_threads;
95 int n_rasterizer_threads;
96 int n_fragment_threads;
97
98 // initialize vertex processor
99 VertexProcessor vertex_processor;
100
101 // initialize rasterizer
102 Rasterizer rasterizer;
103
104 // initialize fragment processor
105 FragmentProcessor fragment_processor;
106
107 std::vector<unsigned char>& rendering_res;
108
109private:
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 WhittedRenderer(RenderEngine& engine);
122 /*! \~chinese whitted-style 渲染器的渲染调用接口 */
123 void render(Scene& scene);
124 /*! \~chinese 镜面反射的阈值 */
125 static constexpr float mirror_threshold = 1000.0f;
126 float& width;
127 float& height;
128 int& n_threads;
129 /*! \~chinese 是否使用 BVH 进行加速*/
131 std::vector<unsigned char>& rendering_res;
132
133private:
134 /*!
135 * \~chinese
136 * \brief 菲涅尔方程根据观察角度计算反射光线的所占百分比
137 *
138 * \param I 入射光方向
139 * \param N 法线向量
140 * \param ior 当前反射介质的折射率
141 *
142 */
143 float fresnel(const Eigen::Vector3f& I, const Eigen::Vector3f& N, const float& ior);
144 std::optional<std::tuple<Intersection, GL::Material>> trace(const Ray& ray, const Scene& scene);
145 /*!
146 * \~chinese
147 * \brief 追踪指定光线得到颜色
148 *
149 * \param ray 当前追踪的光线
150 * \param scene 当前渲染的场景
151 * \param depth 最大反射次数
152 */
153 Eigen::Vector3f cast_ray(const Ray& ray, const Scene& scene, int depth);
154 std::shared_ptr<spdlog::logger> logger;
155};
156
157#endif // DANDELION_RENDER_RENDER_ENGINE_H
负责执行片元着色器的工作线程。
定义 rasterizer_renderer.h:47
实现光栅化渲染管线。
定义 render_engine.h:82
float & width
定义 render_engine.h:92
void render(const Scene &scene)
定义 rasterizer_renderer.cpp:68
光栅化器
定义 rasterizer.h:36
离线渲染的执行入口
定义 render_engine.h:45
int n_threads
定义 render_engine.h:54
static Eigen::Vector3f background_color
定义 render_engine.h:68
std::unique_ptr< WhittedRenderer > whitted_render
定义 render_engine.h:73
std::vector< unsigned char > rendering_res
定义 render_engine.h:50
void render(Scene &scene, RendererType type)
离线渲染入口,负责调用渲染器的渲染函数
定义 render_engine.cpp:16
float width
定义 render_engine.h:52
std::unique_ptr< RasterizerRenderer > rasterizer_render
定义 render_engine.h:71
表示一个包含相机、光源、物体的完整场景。
定义 scene.h:46
负责执行顶点着色器的工作线程。
定义 rasterizer_renderer.h:30
实现 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:63
bool use_bvh
定义 render_engine.h:130
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:125
一些公用的渲染管线接口。
RendererType
可用的渲染器类型
定义 render_engine.h:33
光栅化渲染器中光栅化阶段的实现。
光栅化渲染器中顶点处理、片元处理两个阶段的实现。
定义 ray.h:24