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 中
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"
对于某些事情(例如窗口进程地址和类型,如GLuint
,GLfloat
等),仍然需要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