97个版本
0.35.0 | 2024年8月4日 |
---|---|
0.34.0 | 2024年1月3日 |
0.33.0 | 2023年11月1日 |
0.32.1 | 2022年7月30日 |
0.2.0 | 2015年3月30日 |
#376 in 图形API
39,136 每月下载量
在 不到 150 crates 中使用
1.5MB
28K SLoC
glum
致当前和未来的Glum用户
Glum 不再由其原始作者积极开发。尽管如此,PR仍然受到欢迎,并由周围社区继续维护。
优雅且安全的OpenGL包装器。
Glum是OpenGL和您的应用程序之间的中间层。您仍然需要手动处理图形管线,但无需使用OpenGL过时且易出错的API。
[dependencies]
glium = "*"
其目标
- 安全使用。OpenGL中许多可能导致崩溃的方面都由Glum自动处理。
- 提供一个强制执行良好实践的API,如RAII或无状态函数调用。
- 与所有支持着色器的OpenGL版本兼容,当出现差异时提供统一的API。
- 在 beforehand 避免所有OpenGL错误。
- 生成优化的OpenGL函数调用,并允许用户轻松使用现代OpenGL技术。
链接到文档
如果您对OpenGL有些了解,文档和示例应能帮助您轻松入门。
链接到正在进行的教程
为什么我应该使用Glum而不是原始OpenGL调用?
易于使用
-
在glium中,函数的级别比OpenGL更高。Glium的API试图尽可能“Rusty”,并且与使用任何其他Rust库相比,不应该有太大的不同。Glium应该允许您通过高级函数完成OpenGL允许您完成的所有操作。如果缺少某些功能,请打开一个问题。
-
您可以直接将向量、矩阵和图像传递给glium,而不是操作底层数据。
-
多亏了glutin,与原始OpenGL相比,设置glium非常简单。
-
glium提供了更简单的方式来完成常见任务。例如,
VertexBuffer
结构体包含了关于顶点绑定的信息,因为您通常不会使用多个不同的绑定与同一个顶点缓冲区。这降低了OpenGL的整体复杂性。 -
glium为您处理了帧缓冲对象、采样器和顶点数组对象。您不再需要显式创建它们,因为当需要时它们会自动创建,并且在对应的对象被销毁时它们会被销毁。
-
glium是无状态的。在整个库中,没有
set_something()
函数,一切操作都通过参数传递完成。相同的函数调用集将始终产生相同的结果,这大大减少了潜在问题的数量。
安全性
-
glium会检测OpenGL中通常被认为是错误或未定义的行为,并直接崩溃,而不调用可能会很慢的
glGetError
。例如,在没有深度缓冲区的情况下请求深度测试,未将任何值绑定到属性或统一变量,或者将不同尺寸的多个纹理绑定到同一个帧缓冲区。 -
如果OpenGL上下文触发了错误,那么您在glium中找到了一个bug。请打开一个问题。就像Rust会尽力避免崩溃一样,glium也会尽力避免OpenGL错误。
-
OpenGL上下文由glium自动处理。您无需担心线程安全性,因为不允许更改OpenGL对象操作的线程。Glium还允许您安全地用另一个共享相同列表的OpenGL上下文替换当前上下文。
-
glium强制执行RAII。创建一个
Texture2d
结构体会创建一个纹理,销毁结构体会销毁纹理。它还使用Rust的借用系统来确保当您使用它们时,对象仍然是活跃的和正确的状态。Glium提供了与Rust中常规对象相同的保证,即OpenGL对象。 -
高级函数易于使用,因此错误的可能性更低。例如,没有在指定顶点属性名称和偏移时出错的风险,因为Glium会为您自动生成这些数据。
-
健壮性会自动处理。如果OpenGL上下文丢失(例如,由于驱动程序崩溃),则交换缓冲区将返回一个错误。
兼容性
-
在其默认模式下,Glium应与OpenGL和OpenGL ES兼容。如果OpenGL ES上某些功能不工作,请打开一个问题。
-
在初始化过程中,glium会检测上下文是否提供了所有必需的功能,如果设备太旧,则返回一个
Err
。glium会尽可能地保持宽容,应该能与OpenGL2时代的多数设备一起工作。 -
glium将尝试使用OpenGL函数的最新、优化版本。这包括缓冲区和纹理不可变存储以及直接状态访问。如果不可用,它将自动回退到旧函数。
-
Glium自带了一组测试,您可以使用
cargo test
命令运行。如果您的项目/游戏在特定硬件上无法正常工作,您可以尝试在它上面运行Glium的测试,以查看哪里出错了。
性能
-
状态改变已优化。只有在实际状态改变的情况下,OpenGL状态才会被修改。例如,如果您连续两次使用
draw
和IfLess
深度测试调用,则glDepthFunc(GL_LESS)
和glEnable(GL_DEPTH_TEST)
只会被调用第一次。如果您随后使用draw
和IfGreater
,则只会调用glDepthFunc(GL_GREATER)
。 -
由于Rust在理论上是比C慢,因为它增加了额外的安全检查,所以glium在理论上是比准备充分且经过优化的原始OpenGL调用慢。然而,在实践中,这种差异非常小。
-
完全优化的OpenGL代码使用了高级技术,如持久映射或无绑定纹理。这些技术很难实现且容易出错,但使用glium却非常简单。您只需正确地调用函数即可轻松获得巨大的性能提升。
-
由于glium自动避免所有OpenGL错误,因此当该扩展可用时,您可以安全地使用
GL_KHR_no_error
扩展。使用此扩展应该提供良好的性能提升(但它也是最新的,目前尚不可用)。
限制
-
鲁棒性尚未在所有地方得到支持,因此如果您的着色器中存在错误,仍然可能导致崩溃。
-
Glium提供了所有工具,但不会阻止您进行非常缓慢的操作。如果您想达到最佳性能,需要具备一些现代技术的知识。
-
Glium将Rust编译器推到了极限。堆栈溢出(在编译器内部)、内部编译器错误、一小时编译时间等问题比在较小的库中更为常见。
-
宏仍然处于开发中;有关详细信息,请参阅
glium-derive
。
依赖项
~5–23MB
~312K SLoC