#opengl #opengl-context #gl #khronos #graphics

gl-headless

创建无头 OpenGL 上下文的最简单方法

3 个不稳定版本

0.2.2 2023 年 5 月 31 日
0.2.1 2023 年 5 月 31 日
0.2.0 2023 年 5 月 31 日
0.1.0 2023 年 5 月 30 日

#102 in 渲染

MIT 许可证

15KB
159

gl-headless

Latest Version Docs License

创建无头 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