2 个版本
0.1.1 | 2023 年 2 月 23 日 |
---|---|
0.1.0 | 2023 年 2 月 23 日 |
#857 in 图形 API
在 2 个 Crates 中使用 (通过 ezgl)
385KB
6.5K SLoC
gl_struct_loader
用于加载/调用 GL 函数的结构体
lib.rs
:
包含一个可以加载 GL 函数指针并允许调用它们的结构的库。
此库支持
- 所有 "Core" 配置文件中的 OpenGL 函数,最高到 4.6 (
api="gl"
) - 所有从 2.0 到 3.2 的 OpenGL ES 函数 (
api="gles2"
) - GL_KHR_debug 扩展 (它是 OpenGL 4.3 和 OpenGL ES 3.2 的核心部分,但在早期版本中必须作为扩展使用)。
典型初始化
let gl = {
let user_loader = |name| unimplemented!("call some OS fn here");
let mut gl = GlFns::new_boxed();
unsafe { gl.load(user_loader) };
gl
};
new_boxed 函数在堆上直接创建结构体(它相当大,不能保持在栈上),需要库的 alloc
功能(默认开启)。如果您无法使用 alloc
库但仍想使用 GL,可以使用 BLANK_GL_FNS
常量来创建结构的空值。
全局 GL
如果您想在任何地方调用 GL API(例如在 C 程序中),仍然可以使用这个库,尽管我必须承认这有点笨拙。
当库的 std
功能(默认开启)启用时,有一个名为 [GL
] 的静态 RwLock 可用。
unsafe {
// Grab a write lock to load the functions
GL.write().unwrap().load(|name| core::ptr::null());
// Then a read lock lets you call the functions
GL.read().unwrap().ClearColor(1.0, 0.0, 0.5, 1.0);
}
但是,您可以使用它来封装并隐藏 GL API 的不安全性,也可以隐藏锁定和所有那些,所以在实践中还不错。
已加载的内容
如果您尝试调用未加载的函数,将会导致 panic。
如果您想检查一个函数是否已加载,您可以调用 has_loaded
方法(提供一个 FnLoadedChecker
)然后是您想检查状态的那个方法。
let gl = BLANK_GL_FNS;
assert_eq!(gl.has_loaded().ClearColor(), false);
尽管如此,在某些平台上,即使当前上下文的API级别和允许的扩展实际上不允许您合法地调用该函数,一个函数仍然可能被加载。与大多数任何不正确的C API使用一样,实际上这样做是不确定的。
我要特别明确:您应该 仅 调用当前上下文的API级别和扩展列表允许的函数。