1 个不稳定版本
使用旧的 Rust 2015
0.22.0 | 2018 年 12 月 3 日 |
---|
在 图形 API 中排名 814
1.5MB
27K SLoC
glium
给当前和未来的 Glium 用户的一封信
Glium 已不再由其原始作者积极开发 [链接]。尽管如此,PR 仍然受欢迎,并由周围的社区继续维护。
精美且安全的 OpenGL 包装器。
Glium 是 OpenGL 和你的应用程序之间的中间层。你仍需手动处理图形管线,但无需使用过时且易出错的 OpenGL API。
[dependencies]
glium = "*"
其目标
- 安全使用。许多可能导致崩溃的 OpenGL 方面都由 glium 自动处理。
- 提供一个强制执行良好实践的 API,如 RAII 或无状态函数调用。
- 兼容所有支持着色器的 OpenGL 版本,在出现分歧时提供统一的 API。
- 在事先避免所有 OpenGL 错误。
- 生成优化的 OpenGL 函数调用,并允许用户轻松使用现代 OpenGL 技术。
链接到文档
如果你有一些 OpenGL 的知识,文档和示例应该能让你轻松开始。
链接到正在进行的教程
为什么我应该使用 Glium 而不是原始 OpenGL 调用?
易于使用
-
在 glium 中,函数的级别比 OpenGL 更高。Glium 的 API 尽量做到 Rust 化,与其他 Rust 库的使用不会有太大差异。Glium 应该允许你通过高级函数完成 OpenGL 允许你完成的任何事情。如果缺少某些功能,请提出问题。
-
你可以直接将向量、矩阵和图像传递给 glium,而不是操作低级数据。
-
得益于 glutin,与原始 OpenGL 相比,设置 glium 非常容易。
-
glium 提供了更简单的方式来完成常见任务。例如,
VertexBuffer
结构包含关于顶点绑定的信息,因为你通常不会使用具有相同顶点缓冲区的多个不同的绑定。这降低了 OpenGL 的整体复杂性。 -
glium 会为你处理帧缓冲区对象、采样器和顶点数组对象。你不再需要显式创建它们,因为它们在需要时自动创建,在相应的对象被销毁时自动销毁。
-
glium 无状态。在整个库中没有
set_something()
函数,所有操作都是通过参数传递完成的。同一组函数调用将始终产生相同的结果,这大大减少了潜在问题的数量。
安全性
-
glium 会检测 OpenGL 中通常被认为是错误或未定义行为的情况,并引发恐慌,而不是调用
glGetError
(这会太慢)。例如,当没有深度缓冲区可用时请求深度测试,没有绑定任何值到属性或统一变量,或者将不同尺寸的多个纹理绑定到同一个帧缓冲区。 -
如果 OpenGL 上下文触发了错误,那么你已经在 glium 中找到了一个错误。请提出问题。就像 Rust 做了一切可以做的事情来避免崩溃一样,glium 也做了一切可以做的事情来避免 OpenGL 错误。
-
OpenGL 上下文由 glium 自动处理。你不必担心线程安全,因为不允许改变 OpenGL 对象操作的线程。glium 还允许你安全地将当前的 OpenGL 上下文替换为具有相同列表的另一个上下文。
-
glium 强制执行 RAII。创建一个
Texture2d
结构会创建一个纹理,销毁结构会销毁纹理。它还使用 Rust 的借用系统来确保当你使用它们时,对象仍然存活且处于正确状态。glium 为 OpenGL 对象提供了与 Rust 中的常规对象相同的保证。 -
高级函数更容易使用,因此出错的可能性更小。例如,由于 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编译器推到了极限。堆栈溢出(在编译器内部)、内部编译器错误、一小时编译时间等,比在小库中更常见。
-
Rust插件尚不稳定,因此您必须使用宏,如
implement_vertex!(MyStruct)
,而不是#[derive(GliumVertex)]
。
依赖项
~3–15MB
~144K SLoC