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

glium

优雅且安全的OpenGL包装器。Glum是OpenGL和您的应用程序之间的中间层。您仍然需要手动处理图形管线,但无需使用OpenGL过时且易出错的API。其目标:- 安全使用。OpenGL中许多可能导致崩溃的方面都由Glum自动处理。- 提供一个强制执行良好实践的API,如RAII或无状态函数调用。- 与所有支持着色器的OpenGL版本兼容,当出现差异时提供统一的API。- 在 beforehand 避免所有OpenGL错误。- 生成优化的OpenGL函数调用,并允许用户轻松使用现代OpenGL技术。

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

Download history 10618/week @ 2024-05-02 11680/week @ 2024-05-09 15877/week @ 2024-05-16 10926/week @ 2024-05-23 10441/week @ 2024-05-30 10340/week @ 2024-06-06 10370/week @ 2024-06-13 9976/week @ 2024-06-20 6617/week @ 2024-06-27 6365/week @ 2024-07-04 8452/week @ 2024-07-11 11245/week @ 2024-07-18 8521/week @ 2024-07-25 9040/week @ 2024-08-01 11505/week @ 2024-08-08 8699/week @ 2024-08-15

39,136 每月下载量
不到 150 crates 中使用

Apache-2.0

1.5MB
28K SLoC

glum

Build Status Coverage Status

crates.io page

致当前和未来的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状态才会被修改。例如,如果您连续两次使用drawIfLess深度测试调用,则glDepthFunc(GL_LESS)glEnable(GL_DEPTH_TEST)只会被调用第一次。如果您随后使用drawIfGreater,则只会调用glDepthFunc(GL_GREATER)

  • 由于Rust在理论上是比C慢,因为它增加了额外的安全检查,所以glium在理论上是比准备充分且经过优化的原始OpenGL调用慢。然而,在实践中,这种差异非常小。

  • 完全优化的OpenGL代码使用了高级技术,如持久映射或无绑定纹理。这些技术很难实现且容易出错,但使用glium却非常简单。您只需正确地调用函数即可轻松获得巨大的性能提升。

  • 由于glium自动避免所有OpenGL错误,因此当该扩展可用时,您可以安全地使用GL_KHR_no_error扩展。使用此扩展应该提供良好的性能提升(但它也是最新的,目前尚不可用)。

限制

  • 鲁棒性尚未在所有地方得到支持,因此如果您的着色器中存在错误,仍然可能导致崩溃。

  • Glium提供了所有工具,但不会阻止您进行非常缓慢的操作。如果您想达到最佳性能,需要具备一些现代技术的知识。

  • Glium将Rust编译器推到了极限。堆栈溢出(在编译器内部)、内部编译器错误、一小时编译时间等问题比在较小的库中更为常见。

  • 宏仍然处于开发中;有关详细信息,请参阅glium-derive

依赖项

~5–23MB
~312K SLoC