使用旧的Rust 2015
0.1.2 |
|
---|---|
0.1.1 |
|
0.1.0 |
|
#55 in #gl
290KB
5K SLoC
glitter - 一个安全、低级、无成本的Rust OpenGL包装库
glitter是一个实验性的Rust库,用于包装OpenGL图形API。它适用于性能和正确性至关重要的应用,如游戏和游戏引擎开发。目前,glitter仅支持OpenGL ES2 API,但将在未来的版本中改变。
crates.io
文档
(文档,就像整个项目一样,仍在进行中。每个公共API都已文档化,但仍有许多需要清理!)
展示代码!
在examples
目录中目前有两个示例,这些示例使用了sdl2
crate。这些可以运行,例如使用以下命令:
$ cargo run --example hello-triangle
此外,为了让大家尝尝鲜,这里是一个简单的“hello triangle”示例片段
#[macro_use] extern crate glitter;
use glitter::prelude::*;
// ...platform-specific OpenGL setup...
let gl = unsafe { glitter::Context::current_context() };
gl.clear_color(glitter::Color { r: 0.0, g: 0.0, b: 0.0, a: 0.0 });
gl.clear(glitter::COLOR_BUFFER_BIT);
#[derive(Clone, Copy)]
struct Vertex {
position: [f32; 2],
color: [f32; 3]
}
impl_vertex_data!(Vertex, position, color);
let vertices = [
Vertex { position: [-1.0, -1.0], color: [1.0, 0.0, 0.0] },
Vertex { position: [ 0.0, 1.0], color: [0.0, 1.0, 0.0] },
Vertex { position: [ 1.0, -1.0], color: [0.0, 0.0, 1.0] }
];
let vertex_source = r##"#version 100
attribute vec2 position;
attribute vec3 color;
varying vec3 _color;
void main() {
gl_Position = vec4(position, -1.0, -1.0);
_color = color;
}
"##;
let fragment_source = r##"#version 100
varying highp vec3 _color;
void main() {
gl_FragColor = vec4(_color, 1.0);
}
"##;
let vertex_shader = gl.build_vertex_shader(vertex_source).unwrap();
let fragment_shader = gl.build_fragment_shader(fragment_source).unwrap();
let mut program = gl.build_program(&[vertex_shader, fragment_shader]).unwrap();
let mut vertex_buffer: glitter::VertexBuffer<Vertex> = gl.new_vertex_buffer();
let attribs = attrib_pointers! {
position => gl.get_attrib_location(&program "position").unwrap(),
color => gl.get_attrib_location(&program, "color").unwrap()
};
vertex_buffer.bind_attrib_pointers(attribs);
let (mut gl_vertex_buffer, gl) = gl.bind_vertex_buffer(&mut vertex_buffer);
gl.buffer_vertices(&mut gl_vertex_buffer, &vertices, glitter::STATIC_DRAW);
let (_, gl) = gl.use_program(&mut program);
gl.draw_arrays_vbo(&gl_vertex_buffer, glitter::TRIANGLES);
设计
安全性
glitter旨在尽可能静态地防止OpenGL错误,使用编译时检查。此外,在调试模式下,glitter默认检查所有OpenGL错误。
低级
大多数OpenGL函数在glitter中都有1:1的对应。此外,还提供了一些适用于适用场景的高级抽象,例如使用VertexBuffer
(https://kylewlacy.github.io/glitter/docs/glitter/vertex_buffer/struct.VertexBuffer.html)类型,它提供了一个低开销、高级接口来创建、缓冲和绘制顶点数据。
零成本
glitter中的许多核心类型都是由[零大小类型] (https://doc.rust-lang.net.cn/nomicon/vec-zsts.html)或指向零大小类型的指针(例如Context
类型)组成的。这意味着glitter方法调用通常可以直接编译为OpenGL函数调用。
有关glitter如何实现其设计目标的更多详细信息,请参阅文档。
接下来是什么?
闪光效果目前仍处于'实验'阶段。功能可能会出现错误,API调用可能会中断,有些功能可能会直接缺失。因此,以下是近期(较近的将来)即将到来的功能列表:
- 测试设置和测试套件
- 添加缺少的OpenGL ES 2.0方法
- 修复示例中的丑陋的"VAO黑客"问题
- 为针对不同的OpenGL版本设置框架(目前OpenGL ES 2.0已经内置 - 目标是能够列出应用程序想要针对的OpenGL版本和扩展,并且只为那一组功能生成代码)
- 整理文档(使文档更清晰,添加更多示例,删除死链接等)
常见问题解答
我应该使用这个吗?
不。除非你喜欢使用有缺陷、错误百出、未经测试的库,这些库的API在次要版本之间可能会崩溃。换句话说,直到闪光效果达到1.0 :)。
我接受有缺陷、错误百出、未经测试的库,这些库的API在次要版本之间可能会崩溃!我可以使用这个吗?
当然,尽情使用!但如果你发现所有代码都无法编译,请不要说我没有警告过你...
我发现了一些问题,比如不工作的OpenGL函数、拼写错误的文档(将'indicies'拼写为'indices'),或者一个愚蠢的API,它会破坏借用检查器。我可以在哪里大声地告诉你这个问题?
请随时提交问题!我也欢迎对API更改或想法的建议!
许可
此存储库中的所有源代码都根据用户的喜好,在MIT许可证和Apache 2.0许可证下许可。目录中的所有代码在公共领域内额外可用,根据Unlicense的条款。有关一些法律术语,请参阅相应的LICENSE
文件。
依赖关系
~12MB
~62K SLoC