Dandelion 1.1.2
A light-weight 3D builder for educational usage
载入中...
搜索中...
未找到
gl.hpp
浏览该文件的文档.
1#ifndef DANDELION_PLATFORM_GL_HPP
2#define DANDELION_PLATFORM_GL_HPP
3
4#include <cstddef>
5#include <type_traits>
6#include <vector>
7#include <string>
8#include <array>
9
10#include <Eigen/Core>
11#ifdef _WIN32
12 #include <Windows.h>
13#endif
14#include <glad/glad.h>
15
16#include "shader.hpp"
18
19/*!
20 * \file platform/gl.hpp
21 * \~chinese
22 * 提供 OpenGL API 的封装和一些向 GPU 传递数据的工具。
23 */
24
25/*!
26 * \ingroup platform
27 * \~chinese
28 * \brief 所有对 OpenGL 的封装类型和工具函数均在此命名空间中。
29 */
30namespace GL {
31
32/* --------------------------------------------------------
33 * The definition region.
34 * --------------------------------------------------------
35 */
36
37/*!
38 * \ingroup platform
39 * \~chinese
40 * \brief 获取某个基本数据类型对应的枚举值(用于传递给某些 OpenGL API)。
41 * \tparam DataType 指定的基本数据类型
42 * \returns 如果是基本数据类型,则返回对应的枚举值;如果不是,则返回 GL_NONE。
43 */
44template<typename DataType>
45constexpr GLenum get_GL_type_enum();
46
47/*!
48 * \ingroup platform
49 * \~chinese
50 * \brief 对 OpenGL 顶点数组对象 (Vertex Array Object) 的封装。
51 *
52 * 这个结构体只对 VAO 做了最基本的封装,稍微简化了手动构造和使用 VAO
53 * 的过程。由于此结构体的实例将持有 OpenGL VAO 的名字 (name) 或者叫描述符,它不允许被复制构造。
54 */
56{
57 /*! \~chinese
58 * 构造函数将调用 glGenVertexArrays 创建一个 OpenGL VAO,其名字存储于 `descriptor` 属性中。
59 */
61 VertexArrayObject(VertexArrayObject& other) = delete;
62 VertexArrayObject& operator=(VertexArrayObject& other) = delete;
63 /*! \~chinese
64 * 移动构造函数是为满足 MoveInsertable 条件而写的,保证持有 VAO 的其他对象能使用 `std::vector`
65 * 之类的容器存储。此构造函数会将 `other` 的 `descriptor` 设置成 0,从而避免 `other`
66 * 析构时将真正的 OpenGL VAO 删除掉。
67 */
69 /*! \~chinese 调用 glDeleteVertexArrays 删除 VAO。 */
71 /*! \~chinese 绑定 VAO,仅用于更新它持有的 buffer 数据或格式时才需要专门调用。 */
72 void bind();
73 /*! \~chinese 解绑 VAO。 */
74 void release();
75 /*! \~chinese 绘制这个 VAO 记录的所有内容,无需专门绑定和解绑。 */
76 void draw(GLenum mode, int first, std::size_t count);
77
78 /*! \~chinese OpenGL VAO 的名字 (name),是该 VAO 的唯一标识。 */
79 unsigned int descriptor;
80};
81
82/*!
83 * \ingroup platform
84 * \~chinese
85 * \brief 对 OpenGL 数组缓冲 (Array Buffer) 的封装。
86 *
87 * Array Buffer 通常用于创建顶点缓冲对象 (Vertex Buffer Object, VBO),用于存储顶点属性。
88 * 与 `VertexArrayObject` 对象不同的是,`ArrayBuffer` 对象持有内存数据副本。
89 * 如果希望更新显存中的数据,首先应当直接修改它持有的 `data` 成员,然后调用 `to_gpu`
90 * 复制到显存。
91 * \tparam T 此缓冲区中存放的数据类型,应当指定为基本数据类型,否则行为未定义。
92 * \tparam size 每个顶点的数据个数,例如 size 是 3 表示缓冲区中每三个数据是一组,
93 * 这一组数据属于同一个顶点。
94 */
95template<typename T, std::size_t size>
97{
98 /*! \~chinese
99 * 调用 glGenBuffers 创建 Array Buffer,并设置此缓冲区绘制时的 hint 信息。
100 * \param buffer_usage 绘制 hint 信息,参考 `usage` 属性。
101 */
102 ArrayBuffer(GLenum buffer_usage, unsigned int layout_location);
103 /*! \~chinese 禁止拷贝构造。 */
104 ArrayBuffer(const ArrayBuffer& other) = delete;
105 /*! \~chinese 禁止拷贝赋值。 */
107 /*! \~chinese
108 * 为满足 MoveInsertable 编写的移动构造函数,参考 `VertexArrayObject` 的移动构造函数。
109 */
110 ArrayBuffer(ArrayBuffer&& other);
111 /*! \~chinese 调用 `glDeleteBuffers` 删除 Array Buffer。 */
113 /*! \~chinese
114 * 将 `size` 个数据附加到现有数据的末尾。
115 */
116 template<typename... Ts>
117 void append(Ts... values);
118 /*!
119 * \~chinese
120 * \brief 更新指定位置的 3 个 `float` 数据,仅限 `T = float` 时使用,否则行为未定义。
121 *
122 * \param index 要更新的顶点索引
123 * \param value 新的值
124 */
125 void update(size_t index, const Eigen::Vector3f& value);
126 /*! \~chinese
127 * 统计这个 `ArrayBuffer` 中有多少个顶点的数据,也就是数据个数除以 `size`。
128 */
129 std::size_t count() const;
130 /*! \~chinese 绑定 ArrayBuffer。 */
131 void bind();
132 /*! \~chinese 解绑 ArrayBuffer。 */
133 void release();
134 /*! \~chinese 指定数据格式并使 `layout_location` 位置的属性生效。 */
136 /*! \~chinese 使 `layout_location` 位置的属性失效。 */
137 void disable();
138 /*! \~chinese 将数据传送到 GPU,已经包含了绑定操作,但不包含解绑操作。 */
139 void to_gpu();
140
141 /*! \~chinese OpenGL Array Buffer 的名字 (name),是它的唯一标识。 */
142 unsigned int descriptor;
143 /*! \~chinese
144 * 绘制时的 hint 信息,可以是 `GL_STATIC_DRAW / GL_DYNAMIC_DRAW / GL_STREAM_DRAW`
145 * 其中之一。根据 OpenGL 标准,这只是一个提示信息,不具有任何强制性。
146 */
147 unsigned int usage;
148 /*! \~chinese
149 * 这个 ArrayBuffer 存储的属性在 vertex shader 中对应的位置。
150 */
151 unsigned int layout_location;
152 /*! \~chinese 内存中的数据副本。 */
153 std::vector<T> data;
154};
155
156/*!
157 * \ingroup platform
158 * \~chinese
159 * \brief 对 OpenGL 索引数组缓冲 (Element Array Buffer) 的封装。
160 *
161 * Element Array Buffer 通常用于创建索引缓冲对象 (Element Buffer Object, EBO),用于存储顶点索引。
162 * EBO 通常保存边或者面对应的顶点索引,从而避免多次存储重复的顶点数据。
163 * `ElementArrayBuffer` 对象持有内存索引数据副本。如果希望更新显存中的数据,
164 * 首先应当直接修改它的 `data` 成员,然后调用 `to_gpu` 复制到显存。
165 *
166 * 遵循 OpenGL 的规范,`ElementArrayBuffer` 只允许使用 `unsigned int` 存储索引,
167 * 不允许指定其他的索引数据类型。
168 * \tparam size 每个基元(边或者面)对应的顶点索引个数,例如三角形面的 `size` 是 3。
169 */
170template<std::size_t size>
172{
173 /*!
174 * \~chinese
175 * \brief 构造一个 EBO 对象。
176 *
177 * \param buffer_usage 该对象的使用方式,可以是 `GL_STATIC_DRAW` / `GL_DYNAMIC_DRAW`
178 * / `GL_STREAM_DRAW` 其中之一。该信息只作为 hint,没有强制力。
179 */
180 ElementArrayBuffer(unsigned int buffer_usage);
181 /*! \~chinese 禁止拷贝构造。 */
183 /*! \~chinese 禁止拷贝赋值。 */
185 /*! \~chinese 参考 `VertexArrayObject` 的移动构造函数。 */
187 /*!
188 * \~chinese
189 * \brief 调用 `glDeleteBuffers` 销毁该 EBO。
190 */
192 /*! \~chinese 将 `size` 个数据附加到末尾。 */
193 template<typename... Ts>
194 void append(Ts... values);
195 /*! \~chinese 统计总共有多少个 **基元** (而不是顶点)。 */
196 std::size_t count() const;
197 /*! \~chinese 绑定该 EBO。 */
198 void bind();
199 /*! \~chinese 解绑该 EBO。 */
200 void release();
201 /*! \~chinese 将内存数据复制到显存,已包含绑定操作,但不包含解绑操作。 */
202 void to_gpu();
203
204 /*! \~chinese OpenGL EBO 名字 (name),该对象的唯一标识。 */
205 unsigned int descriptor;
206 /*! \~chinese 该 EBO 的使用方式,见构造函数说明。 */
207 unsigned int usage;
208 /*!
209 * \~chinese
210 * \brief 内存中的索引数据副本。
211 *
212 * 使用 `unsigned int` 而非 `size_t` 的原因是 OpenGL 不接受 `size_t`。
213 * */
214 std::vector<unsigned int> data;
215};
216
217/*!
218 * \ingroup platform
219 * \ingroup rendering
220 * \~chinese
221 * \brief 物体材质。
222 *
223 * 该类型实现了一个简单的 Phong 材质模型,包含环境光、漫反射、镜面反射三个颜色向量,
224 * 以及一个光滑度参数。
225 */
227{
228 /*!
229 * \~chinese
230 * \brief 构造一个材质对象。
231 * \param K_ambient 环境光系数(颜色)
232 * \param K_diffuse 漫反射系数(颜色)
233 * \param K_specular 镜面反射系数(颜色)
234 * \param shininess 光滑度
235 */
236 Material(
237 const Eigen::Vector3f& K_ambient = Eigen::Vector3f(1.0f, 1.0f, 1.0f),
238 const Eigen::Vector3f& K_diffuse = Eigen::Vector3f(0.5f, 0.5f, 0.5f),
239 const Eigen::Vector3f& K_specular = Eigen::Vector3f(0.0f, 0.0f, 0.0f),
240 float shininess = 5.0f
241 );
242 /*! \~chinese 环境光反射系数(颜色)。 */
243 Eigen::Vector3f ambient;
244 /*! \~chinese 漫反射光反射系数(颜色)。 */
245 Eigen::Vector3f diffuse;
246 /*! \~chinese 镜面反射光反射系数(颜色)。 */
247 Eigen::Vector3f specular;
248 /*! \~chinese Phong 模型计算镜面反射时的指数 */
250};
251
252/*!
253 * \~chinese
254 * \brief 用于场景预览渲染的 Mesh 类。
255 *
256 * 为了便于和 OpenGL 交互,这个类不会使用 Eigen 中的各种向量存储顶点坐标、
257 * 法线和颜色等信息,而是直接持有 VAO、VBO 和 EBO 的封装对象,顶点数据全部被展平。
258 *
259 * 由于 OpenGL API 只支持绘制三角形,GL::Mesh 存储的面片 (face) 只能是三角形。
260 * 四边形乃至任意多边形面片需要先三角化成三角形才能被渲染。
261 *
262 * 外界读取 Mesh 中的顶点、边等基元时应当调用 `vertex/normal/edge/face` 方法,
263 * 而不是直接访问 `vertices.data` 等内部存储。这些 ArrayBuffer 或 ElementArrayBuffer
264 * 之所以被设为公有成员,是因为在修改数据或进行渲染时需要操作它们,
265 * 其他情况下都不必也不应该使用这些扁平存储的数据。
266 */
267struct Mesh
268{
269 /*! \~chinese 构造渲染所需的 VAO/VBO/EGO 对象。 */
270 Mesh();
271 /*! \~chinese 由于 VAO 和 ArrayBuffer 不允许复制构造,Mesh 也不允许复制构造。 */
272 Mesh(const Mesh& other) = delete;
273 /*! \~chinese 调用各成员的移动构造。 */
274 Mesh(Mesh&& other);
275 /*! \~chinese 读取编号为 index 的顶点。 */
276 Eigen::Vector3f vertex(size_t index) const;
277 /*! \~chinese 读取编号为 index 的顶点法线。 */
278 Eigen::Vector3f normal(size_t index) const;
279 /*! \~chinese 读取编号为 index 的边。 */
280 std::array<size_t, 2> edge(size_t index) const;
281 /*! \~chinese 读取编号为 index 的面片。 */
282 std::array<size_t, 3> face(size_t index) const;
283 /*! \~chinese 清空内存中的全部数据, **显存不会随之清空** 。 */
284 void clear();
285 /*! \~chinese 调用各成员的 `to_gpu`。 */
286 void to_gpu();
287 /*!
288 * \~chinese
289 * \brief 渲染这个 mesh。
290 *
291 * \param shader `Shader` 对象的引用
292 * \param element_flags 指定渲染哪些元素的二进制串,可以是 `vertices_flag` / `edges_flag` /
293 * `faces_flag` 中的任意一个或多个
294 * \param face_shading 面片是否根据光照和材质进行着色,若否,则统一使用全局颜色。
295 * 通常仅在显示辅助图形时设置,其他情况下使用默认值即可。
296 * \param global_color 要使用的全局颜色,仅当 `face_shading = false` 时有效。
297 */
298 void render(
299 const Shader& shader, unsigned int element_flags, bool face_shading = true,
300 const Eigen::Vector3f& global_color = default_wireframe_color
301 );
302
303 /*! \~chinese 表示开启顶点渲染。 */
304 constexpr static unsigned int vertices_flag = 1u;
305 /*! \~chinese 表示开启边渲染。 */
306 constexpr static unsigned int edges_flag = 1u << 1u;
307 /*! \~chinese 表示开启面片渲染。 */
308 constexpr static unsigned int faces_flag = 1u << 2u;
309 /*! \~chinese 默认线框颜色,应用于顶点和边。 */
310 const static Eigen::Vector3f default_wireframe_color;
311 /*! \~chinese 默认面片颜色。 */
312 const static Eigen::Vector3f default_face_color;
313 /*! \~chinese 表示高亮状态的线框颜色。 */
314 const static Eigen::Vector3f highlight_wireframe_color;
315 /*! \~chinese 表示高亮状态的面片颜色。 */
316 const static Eigen::Vector3f highlight_face_color;
318 ArrayBuffer<float, 3> vertices;
319 ArrayBuffer<float, 3> normals;
322 /*! \~chinese 每个 Mesh 只能有一个材质 */
324};
325
326/*!
327 * \~chinese
328 * \brief 在预览场景时绘制若干线条。
329 *
330 * 这个类与 `GL::Mesh` 相似但更简单,只有顶点 VBO 和线条 EBO,可用于绘制射线、
331 * 半边等线条元素。
332 */
334{
335 /*!
336 * \~chinese
337 * \brief 构造一个 LineSet 对象以绘制线条。
338 * \param name 该对象的名称。因为 `LineSet` 对象不像 `Mesh` 一样从属于某个物体,
339 * 所以它需要有自己的名称以便在输出日志时进行检查。
340 * \param color 线条颜色。
341 */
342 LineSet(const std::string& name, Eigen::Vector3f color = GL::Mesh::default_wireframe_color);
343 /*! \~chinese 由于 VAO 和 ArrayBuffer 不允许复制构造,LineSet 也不允许复制构造。 */
344 LineSet(const LineSet& other) = delete;
345 /*! \~chinese 调用各成员的移动构造。 */
346 LineSet(LineSet&& other);
347 /*! \~chinese 加入一条从 a 到 b 的线段。 */
348 void add_line_segment(const Eigen::Vector3f& a, const Eigen::Vector3f& b);
349 /*! \~chinese 加入一个从 from 到 to 的箭头。 */
350 void add_arrow(const Eigen::Vector3f& from, const Eigen::Vector3f& to);
351 /*! \~chinese 更新索引为 `index` 的箭头,仅当该 `LineSet` 内全部是箭头时才是安全的。 */
352 void update_arrow(size_t index, const Eigen::Vector3f& from, const Eigen::Vector3f& to);
353 /*! \~chinese 加入一个轴对齐包围盒 (Axis-Aligned Bounding Box, AABB) 。 */
354 void add_AABB(const Eigen::Vector3f& p_min, const Eigen::Vector3f& p_max);
355 /*! \~chinese 清空所有元素,但只影响内存,不会同步到显存。 */
356 void clear();
357 /*! \~chinese 将修改同步到显存。 */
358 void to_gpu();
359 /*!
360 * \~chinese
361 * \brief 渲染该线条集。
362 *
363 * 这个函数只会设置对应全局颜色的 uniform 变量,其他所有变量都需要由调用者自行设置。
364 */
365 void render(const Shader& shader);
366
367 /*! \~chinese 绘制的线条颜色。 */
368 Eigen::Vector3f line_color;
370 ArrayBuffer<float, 3> vertices;
372 std::string name;
373};
374
375/* ---------------------------------------------------------
376 * The implementation region for template class and functions.
377 * ---------------------------------------------------------
378 */
379
380template<typename DataType>
381constexpr GLenum get_GL_type_enum()
382{
383 if constexpr (std::is_same_v<DataType, char>) {
384 return GL_BYTE;
385 } else if constexpr (std::is_same_v<DataType, unsigned char>) {
386 return GL_UNSIGNED_BYTE;
387 } else if constexpr (std::is_same_v<DataType, int>) {
388 return GL_INT;
389 } else if constexpr (std::is_same_v<DataType, unsigned int>) {
390 return GL_UNSIGNED_INT;
391 } else if constexpr (std::is_same_v<DataType, float>) {
392 return GL_FLOAT;
393 } else if constexpr (std::is_same_v<DataType, double>) {
394 return GL_DOUBLE;
395 } else {
396 return GL_NONE;
397 }
398}
399
400// ArrayBuffer ---------------------------------------------
401
402template<typename T, std::size_t size>
403ArrayBuffer<T, size>::ArrayBuffer(GLenum buffer_usage, unsigned int layout_location) :
405{
406 glGenBuffers(1, &(this->descriptor));
407}
408
409template<typename T, std::size_t size>
412 data(std::move(other.data))
413{
414 other.descriptor = 0;
415}
416
417template<typename T, std::size_t size>
419{
420 if (this->descriptor != 0) {
421 glDeleteBuffers(1, &(this->descriptor));
422 }
423}
424
425template<typename T, std::size_t size>
426template<typename... Ts>
428{
429 static_assert(
430 (std::is_same_v<decltype(values), T> && ...),
431 "ArrayBuffer: all values to be appended must have the same type as T"
432 );
433 static_assert(
434 sizeof...(values) == size,
435 "ArrayBuffer: number of values to be appended must be same as size per vertex"
436 );
437 (this->data.push_back(values), ...);
438}
439
440template<typename T, std::size_t size>
441void ArrayBuffer<T, size>::update(size_t index, const Eigen::Vector3f& value)
442{
443 const GLintptr offset = index * 3 * sizeof(float);
444 data[index * 3] = value.x();
445 data[index * 3 + 1] = value.y();
446 data[index * 3 + 2] = value.z();
447 bind();
448 glBufferSubData(GL_ARRAY_BUFFER, offset, 3 * sizeof(float), value.data());
449}
450
451template<typename T, std::size_t size>
453{
454 return this->data.size() / size;
455}
456
457template<typename T, std::size_t size>
459{
460 glBindBuffer(GL_ARRAY_BUFFER, this->descriptor);
461}
462
463template<typename T, std::size_t size>
465{
466 glBindBuffer(GL_ARRAY_BUFFER, 0);
467}
468
469template<typename T, std::size_t size>
471{
472 GLenum data_type = get_GL_type_enum<T>();
473 glVertexAttribPointer(
474 this->layout_location, size, data_type, GL_FALSE, size * sizeof(T), (void*)0
475 );
476 glEnableVertexAttribArray(this->layout_location);
477}
478
479template<typename T, std::size_t size>
481{
482 glDisableVertexAttribArray(this->layout_location);
483}
484
485template<typename T, std::size_t size>
487{
488 this->bind();
489 glBufferData(GL_ARRAY_BUFFER, sizeof(T) * this->data.size(), this->data.data(), this->usage);
491}
492
493// ElementArrayBuffer --------------------------------------
494
495template<std::size_t size>
496ElementArrayBuffer<size>::ElementArrayBuffer(unsigned int buffer_usage) : usage(buffer_usage)
497{
498 glGenBuffers(1, &(this->descriptor));
499}
500
501template<std::size_t size>
503 descriptor(other.descriptor), usage(other.usage), data(std::move(other.data))
504{
505 other.descriptor = 0;
506}
507
508template<std::size_t size>
510{
511 if (this->descriptor != 0) {
512 glDeleteBuffers(1, &(this->descriptor));
513 }
514}
515
516template<std::size_t size>
518{
519 return this->data.size() / size;
520}
521
522template<std::size_t size>
523template<typename... Ts>
525{
526 static_assert(
527 (std::is_same_v<decltype(values), unsigned int> && ...),
528 "ElementArrayBuffer: all values to be appended must be unsigned int"
529 );
530 static_assert(
531 sizeof...(values) == size,
532 "ElementArrayBuffer: number of values to be appended must be as same as size per vertex"
533 );
534 (this->data.push_back(values), ...);
535}
536
537template<std::size_t size>
539{
540 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->descriptor);
541}
542
543template<std::size_t size>
545{
546 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
547}
548
549template<std::size_t size>
551{
552 this->bind();
553 glBufferData(
554 GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * this->data.size(), this->data.data(),
555 this->usage
556 );
557}
558
559} // namespace GL
560
561#endif // DANDELION_PLATFORM_GL_HPP
对 GLSL Shader 的简单封装。
定义 shader.hpp:24
constexpr GLenum get_GL_type_enum()
获取某个基本数据类型对应的枚举值(用于传递给某些 OpenGL API)。
定义 gl.hpp:381
所有对 OpenGL 的封装类型和工具函数均在此命名空间中。
定义 gl.hpp:30
这个文件定义了一些和渲染(离线渲染或场景预览)相关的常量、枚举等。
对 OpenGL 数组缓冲 (Array Buffer) 的封装。
定义 gl.hpp:97
ArrayBuffer(GLenum buffer_usage, unsigned int layout_location)
定义 gl.hpp:403
void update(size_t index, const Eigen::Vector3f &value)
更新指定位置的 3 个 float 数据,仅限 T = float 时使用,否则行为未定义。
定义 gl.hpp:441
ArrayBuffer(const ArrayBuffer &other)=delete
void specify_vertex_attribute()
定义 gl.hpp:470
unsigned int layout_location
定义 gl.hpp:151
void append(Ts... values)
定义 gl.hpp:427
void release()
定义 gl.hpp:464
~ArrayBuffer()
定义 gl.hpp:418
unsigned int usage
定义 gl.hpp:147
void disable()
定义 gl.hpp:480
std::vector< T > data
定义 gl.hpp:153
std::size_t count() const
定义 gl.hpp:452
void bind()
定义 gl.hpp:458
ArrayBuffer & operator=(ArrayBuffer &other)=delete
void to_gpu()
定义 gl.hpp:486
unsigned int descriptor
定义 gl.hpp:142
对 OpenGL 索引数组缓冲 (Element Array Buffer) 的封装。
定义 gl.hpp:172
ElementArrayBuffer(const ElementArrayBuffer &other)=delete
std::size_t count() const
定义 gl.hpp:517
unsigned int descriptor
定义 gl.hpp:205
ElementArrayBuffer(unsigned int buffer_usage)
构造一个 EBO 对象。
定义 gl.hpp:496
void bind()
定义 gl.hpp:538
void append(Ts... values)
定义 gl.hpp:524
ElementArrayBuffer & operator=(ElementArrayBuffer &other)=delete
std::vector< unsigned int > data
内存中的索引数据副本。
定义 gl.hpp:214
unsigned int usage
定义 gl.hpp:207
void release()
定义 gl.hpp:544
void to_gpu()
定义 gl.hpp:550
~ElementArrayBuffer()
调用 glDeleteBuffers 销毁该 EBO。
定义 gl.hpp:509
void to_gpu()
定义 gl.cpp:284
void add_line_segment(const Eigen::Vector3f &a, const Eigen::Vector3f &b)
定义 gl.cpp:204
void add_AABB(const Eigen::Vector3f &p_min, const Eigen::Vector3f &p_max)
定义 gl.cpp:248
void render(const Shader &shader)
渲染该线条集。
定义 gl.cpp:292
Eigen::Vector3f line_color
定义 gl.hpp:368
void update_arrow(size_t index, const Eigen::Vector3f &from, const Eigen::Vector3f &to)
定义 gl.cpp:235
void add_arrow(const Eigen::Vector3f &from, const Eigen::Vector3f &to)
定义 gl.cpp:220
void clear()
定义 gl.cpp:278
LineSet(const std::string &name, Eigen::Vector3f color=GL::Mesh::default_wireframe_color)
构造一个 LineSet 对象以绘制线条。
LineSet(const LineSet &other)=delete
物体材质。
定义 gl.hpp:227
Eigen::Vector3f diffuse
定义 gl.hpp:245
float shininess
定义 gl.hpp:249
Eigen::Vector3f specular
定义 gl.hpp:247
Material(const Eigen::Vector3f &K_ambient=Eigen::Vector3f(1.0f, 1.0f, 1.0f), const Eigen::Vector3f &K_diffuse=Eigen::Vector3f(0.5f, 0.5f, 0.5f), const Eigen::Vector3f &K_specular=Eigen::Vector3f(0.0f, 0.0f, 0.0f), float shininess=5.0f)
构造一个材质对象。
定义 gl.cpp:51
Eigen::Vector3f ambient
定义 gl.hpp:243
static const Eigen::Vector3f default_face_color
定义 gl.hpp:312
std::array< size_t, 3 > face(size_t index) const
定义 gl.cpp:112
Material material
定义 gl.hpp:323
Mesh()
定义 gl.cpp:63
void render(const Shader &shader, unsigned int element_flags, bool face_shading=true, const Eigen::Vector3f &global_color=default_wireframe_color)
渲染这个 mesh。
定义 gl.cpp:137
void clear()
定义 gl.cpp:117
static constexpr unsigned int vertices_flag
定义 gl.hpp:304
Mesh(const Mesh &other)=delete
static constexpr unsigned int faces_flag
定义 gl.hpp:308
static const Eigen::Vector3f highlight_wireframe_color
定义 gl.hpp:314
static constexpr unsigned int edges_flag
定义 gl.hpp:306
Eigen::Vector3f normal(size_t index) const
定义 gl.cpp:102
void to_gpu()
定义 gl.cpp:125
Eigen::Vector3f vertex(size_t index) const
定义 gl.cpp:97
static const Eigen::Vector3f default_wireframe_color
定义 gl.hpp:310
static const Eigen::Vector3f highlight_face_color
定义 gl.hpp:316
std::array< size_t, 2 > edge(size_t index) const
定义 gl.cpp:107
对 OpenGL 顶点数组对象 (Vertex Array Object) 的封装。
定义 gl.hpp:56
void bind()
定义 gl.cpp:34
~VertexArrayObject()
定义 gl.cpp:27
VertexArrayObject()
定义 gl.cpp:17
unsigned int descriptor
定义 gl.hpp:79
void release()
定义 gl.cpp:39
void draw(GLenum mode, int first, std::size_t count)
定义 gl.cpp:44