#opengl #gl #graphics #gamedev

已删除 glitter

一个安全、低级、无成本的OpenGL包装库

使用旧的Rust 2015

0.1.2 2017年11月12日
0.1.1 2016年9月5日
0.1.0 2016年2月29日

#55 in #gl

MIT/Apache

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