#opengl #gamedev #graphics-pipeline #api-bindings

azul_glium

[因长期不活跃而 fork 自 tomaka/glium] 精美且安全的 OpenGL 包装器。Glium 是 OpenGL 和你的应用程序之间的中间层。你仍需手动处理图形管线,但无需使用过时且易出错的 OpenGL API。其目标:- 安全使用。许多可能导致崩溃的 OpenGL 方面都由 glium 自动处理。- 提供一个强制执行良好实践的 API,如 RAII 或无状态函数调用。- 兼容所有支持着色器的 OpenGL 版本,在出现分歧时提供统一的 API。- 在事先避免所有 OpenGL 错误。- 生成优化的 OpenGL 函数调用,并允许用户轻松使用现代 OpenGL 技术。

1 个不稳定版本

使用旧的 Rust 2015

0.22.0 2018 年 12 月 3 日

图形 API 中排名 814

Apache-2.0

1.5MB
27K SLoC

glium

Build Status Coverage Status

给当前和未来的 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