3 个不稳定版本
0.2.2 | 2023 年 5 月 31 日 |
---|---|
0.2.1 | 2023 年 5 月 31 日 |
0.2.0 |
|
0.1.0 | 2023 年 5 月 30 日 |
#102 in 渲染
15KB
159 行
gl-headless
创建无头 OpenGL 上下文的最简单方法。
只需将 #[gl_headless]
添加到任何函数(即使是 main
),然后像平常一样调用该函数。在函数的作用域内,将可用 OpenGL 上下文。
请参阅 #[gl_headless]
的文档中的所有可用选项。
简单示例
[dependencies]
gl = "0.14"
gl-headless = "0.2"
use gl_headless::gl_headless;
#[gl_headless]
unsafe fn main() {
let (mut major, mut minor) = (0, 0);
gl::GetIntegerv(gl::MAJOR_VERSION, &mut major);
gl::GetIntegerv(gl::MINOR_VERSION, &mut minor);
println!("OpenGL {major}.{minor}");
}
指定 OpenGL 版本
默认情况下,#[gl_headless]
尝试创建 OpenGL 4.6 上下文。要使用特定版本,例如添加 version = "3.3"
use gl_headless::gl_headless;
#[gl_headless(version = "3.3")]
unsafe fn main() {
let (mut major, mut minor) = (0, 0);
gl::GetIntegerv(gl::MAJOR_VERSION, &mut major);
gl::GetIntegerv(gl::MINOR_VERSION, &mut minor);
println!("OpenGL {major}.{minor}");
}
参数与返回类型
像平常一样指定函数参数和返回类型
use gl_headless::gl_headless;
fn main() {
let version = get_version("OpenGL");
println!("{version}");
}
#[gl_headless]
fn get_version(prefix: &str) -> String {
let (mut major, mut minor) = (0, 0);
unsafe {
gl::GetIntegerv(gl::MAJOR_VERSION, &mut major);
gl::GetIntegerv(gl::MINOR_VERSION, &mut minor);
}
format!("{prefix} {major}.{minor}")
}
多个函数
多个函数可以使用 #[gl_headless]
use gl_headless::gl_headless;
fn main() {
unsafe {
example1();
example2();
}
}
#[gl_headless(version = "3.3")]
unsafe fn example1() {
let (mut major, mut minor) = (0, 0);
gl::GetIntegerv(gl::MAJOR_VERSION, &mut major);
gl::GetIntegerv(gl::MINOR_VERSION, &mut minor);
println!("OpenGL {major}.{minor}");
}
#[gl_headless]
unsafe fn example2() {
let mut handle = 0;
gl::CreateBuffers(1, &mut handle);
let data: [f32; 5] = [1.0, 2.0, 3.0, 4.0, 5.0];
gl::NamedBufferData(
handle,
std::mem::size_of_val(&data) as _,
data.as_ptr() as *const _,
gl::STATIC_DRAW,
);
let mut byte_size = 0;
gl::GetNamedBufferParameteriv(handle, gl::BUFFER_SIZE, &mut byte_size);
let float_count = (byte_size as usize) / std::mem::size_of::<f32>() as usize;
let mut floats = vec![0.0_f32; float_count];
gl::GetNamedBufferSubData(
handle,
0,
std::mem::size_of_val(floats.as_slice()) as _,
floats.as_mut_ptr() as *mut _,
);
println!("Write: {:?}", data);
println!("Read: {:?}", floats);
assert_eq!(data, floats.as_slice());
}
依赖关系
~2–3MB
~63K SLoC