14 个版本
0.1.7 | 2020 年 8 月 24 日 |
---|---|
0.1.6 | 2020 年 8 月 3 日 |
0.1.5 | 2020 年 6 月 21 日 |
0.1.3 | 2020 年 3 月 1 日 |
0.1.0-alpha4 | 2019 年 12 月 26 日 |
#797 in 游戏开发
206 每月下载量
用于 3 个工具箱(通过 quicksilver)
73KB
1.5K SLoC
莱姆
golem
是一个具有见解的、主要安全的图形 API
当可能时,golem
应该使简单的事情安全(在操作它们之前绑定对象,或者检查它们是否已绑定,对于绑定成本较高的对象。)然而,当不可能或方便时(例如在元素缓冲区中检查索引的界限),golem
提供具有明确定义的安全条件的非安全 API。
一个用于显示三角形的示例
use golem::*;
use golem::Dimension::*;
fn func(ctx: &Context) -> Result<(), GolemError> {
let vertices = [
// Position Color
-0.5, -0.5, 1.0, 0.0, 0.0, 1.0,
0.5, -0.5, 0.0, 1.0, 0.0, 1.0,
0.0, 0.5, 0.0, 0.0, 1.0, 1.0
];
let indices = [0, 1, 2];
let mut shader = ShaderProgram::new(
ctx,
ShaderDescription {
vertex_input: &[
Attribute::new("vert_position", AttributeType::Vector(D2)),
Attribute::new("vert_color", AttributeType::Vector(D4)),
],
fragment_input: &[Attribute::new("frag_color", AttributeType::Vector(D4))],
uniforms: &[],
vertex_shader: r#" void main() {
gl_Position = vec4(vert_position, 0, 1);
frag_color = vert_color;
}"#,
fragment_shader: r#" void main() {
gl_FragColor = frag_color;
}"#,
},
)?;
let mut vb= VertexBuffer::new(ctx)?;
let mut eb ElementBuffer::new(ctx)?;
vb.set_data(&vertices);
eb.set_data(&indices);
shader.bind();
ctx.clear();
unsafe {
shader.draw(&vb, &eb, 0..indices.len(), GeometryMode::Triangles)?;
}
Ok(())
}
golem
的核心类型是 Context
,它由 glow::Context
构建。从 Context
,创建 ShaderProgram
,它们从 Buffer
中获取数据。一旦数据通过 Buffer::set_data
上传到 GPU,就可以通过 ShaderProgram::draw
绘制。
初始化
用户负责窗口和提供有效的 glow Context 来创建 Context
。您可以尝试使用与 golem
配合良好的 blinds
工具箱,但也可以直接使用 winit
或其他窗口解决方案,如 sdl2
。
OpenGL 版本
后端目前通过 glow
实现,针对桌面上的 OpenGL 3.2 和 WebGL 1(因此应在广泛的硬件上运行。)选择 GL 3.2 以确保最大桌面可用性,而 WebGL 1 在 97% 的客户端上可用,占 WebGL 的 75%(在编写时从 caniuse.com 获取。)
GLSL
着色器部分由 golem
在运行时生成,以处理平台兼容性问题。用户提供着色器的主函数,而 golem
提供版本号、着色器输入、输出和统一变量。有关更多信息,请参阅 ShaderDescription
文档。
依赖项
~2–4MB
~84K SLoC