#opengl #wrapper #thin #control #gl-rs

rgl

使用 gl-rs 包的 OpenGL 安全薄包装器

4 个版本

使用旧的 Rust 2015

0.2.0 2018 年 8 月 19 日
0.1.2 2018 年 8 月 18 日
0.1.1 2018 年 8 月 18 日
0.1.0 2018 年 8 月 18 日

#507图形 API

MIT/Apache

23KB
504

Rusty GL

注意:这是一个正在进行中的项目。

包: https://crates.io/crates/rgl

摘要

在 gl-rs 之上提供了一个非常薄的包装器,旨在使代码更加“Rust-like”和更安全,同时仍然允许您像经典 OpenGL 代码一样进行控制。

当前功能

  • 顶点缓冲对象
  • 顶点数组对象
  • 着色器
  • 二维纹理
  • 单元结构,如 VAO(GLuint) 强制在函数中传入正确的 OpenGL 对象类型

单元结构

当前单元结构

  • pub struct VBO(GLuint) 用于顶点缓冲对象
  • pub struct VAO(GLuint) 用于顶点数组对象
  • pub struct GLTexture(GLuint) 用于纹理对象
  • pub struct GLShader(GLuint) 用于程序/着色器对象

这些结构没有实现(关联函数),它们只是存在以强制在函数中传递正确的 OpenGL 函数。例如

let mut vao = gl_gen_vertex_array();
gl_bind_buffer(GLTarget::ArrayBuffer, vao);

不会工作,因为 gl_bind_buffer 期望类型 pub struct VBO(GLuint),但 vao 是类型 VAO(GLuint)

路线图

  • 帧缓冲对象
  • 更多OpenGL函数(目前基本上只有最小必要部分!)

用法

[dependancies]
rgl = "0.2.0"
gl = "0.6.0"

对于某些事情(例如窗口进程地址和类型,如GLuintGLfloat等),仍然需要gl-rs创建(gl

示例

如上所述,这个crate旨在成为gl-rs的一个更像Rust的替代品。

例如,gl-rs中的代码

let mut vao = 0;
let mut vbo = 0;

unsafe {
    // Create Vertex Array Object
    gl::GenVertexArrays(1, &mut vao);
    gl::BindVertexArray(vao);

    // Create a Vertex Buffer Object and copy the vertex data to it
    gl::GenBuffers(1, &mut vbo);
    gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
    gl::BufferData(
        gl::ARRAY_BUFFER,
        (VERTEX_DATA.len() * mem::size_of::<GLfloat>()) as GLsizeiptr,
        mem::transmute(&VERTEX_DATA[0]),
        gl::STATIC_DRAW,
    );
    gl::EnableVertexAttribArray(0);
    gl::VertexAttribPointer(
        0,
        2,
        gl::FLOAT,
        gl::FALSE as GLboolean,
        0,
        ptr::null(),
    );
}

可以写成这样

    //Create a vertex array object and a vertex buffer object
    let mut vao = rgl::gen_vertex_array();
    let mut vbo = rgl::gen_buffer();

    //Generate and bind the VAO
    rgl::gl_bind_vertex_array(vao);

    //Generate and bind the VBO
    rgl::gl_bind_buffer(rgl::Target::ArrayBuffer, vbo);

    //Buffer the vertex data and tell OpenGL the structure
    rgl::buffer_data(rgl::Target::ArrayBuffer, &VERTEX_DATA, rgl::Usage::StaticDraw);
    rgl::enable_vertex_attrib_array(0);
    rgl::vertex_attrib_pointer(0, 2, rgl::Type::Float, false, 0);

更改包括

  • 函数名使用snake_case而不是PascalCase
  • rgl crate
  • 不需要使用unsafe {...}
  • 强类型枚举代替易出错的GLenum(你很容易传递错误的枚举)
  • 不需要将类型强制转换为std::os::raw::c_void,rusty-gl会为你做这个
  • 不需要将字符串强制转换为std::ffi::CString,rusty-gl会为你做这个

更多示例

有关使用此crate的示例可以在examples文件夹中找到:[https://github.com/Hopson97/rusty-gl/tree/master/Examples](https://github.com/Hopson97/rusty-gl/tree/master/Examples)

使用cargo run运行示例。

依赖项

~135KB