2 个版本
0.1.2 | 2024 年 8 月 3 日 |
---|---|
0.1.1 | 2024 年 7 月 9 日 |
0.1.0 |
|
#217 in 图形 API
176 每月下载量
10MB
2.5K SLoC
Chaos Framework (WIP)
这是什么?
是 Tiny Game Framework 的继承者。它是一个旨在在易于使用的同时创建酷炫游戏的框架。
它目前支持使用 OpenGL 和 glfw 进行基本图形(纹理、相机、简单的光照等)。它还内置了 Imgui,并使用 tobj 和 assimp 加载模型。
功能
- 基本 2D 和 3D 渲染(纹理、相机、简单的光照等)
- 模型加载
- 骨骼动画
未来计划
- 近期:实例化;粒子;并行化;后期绑定;天空盒(大气着色器和立方体贴图);声音;让它更快;改进光照系统;进一步抽象 OpenGL
- 较远期:使用 Vulkan 代替 OpenGL;支持 Web(可能使用 WGPU);声音合成器引擎;
简单的 2D 示例代码(见示例文件夹)
use chaos_framework::*;
use glfw::Key;
fn main() {
let mut el = EventLoop::new(600, 600);
let mut renderer = Renderer::new();
/* default projection type is perspective */
renderer.camera.set_projection(ProjectionType::Orthographic);
renderer.add_light(Light { position: vec3(0.0, 0.0, 1.0), color: Vec3::ONE })
.unwrap();
/* we'll represent our player using a quad */
let player_handle = renderer.add_mesh(Quad::new(Vec3::ONE * 0.1, Vec4::ONE).mesh())
.unwrap();
while !el.window.should_close() {
el.update();
/* we can modify the player by indexing into it in the renderer's meshes */
let player = &mut renderer.meshes[player_handle];
player.color = vec3(0.5, 0.0, el.time.sin());
move_player(&el, &mut player.position);
renderer.camera.update(Vec3::ZERO, &el);
let frame = el.ui.frame(&mut el.window);
frame.text("hello, world! this is imgui");
unsafe {
Clear(COLOR_BUFFER_BIT | DEPTH_BUFFER_BIT);
ClearColor(0.1, 0.2, 0.3, 1.0);
renderer.draw();
el.ui.draw();
}
}
}
fn move_player(el: &EventLoop, pos: &mut Vec3) {
let mut velocity = Vec3::ZERO;
let mut speed = 1.5;
if el.is_key_down(Key::LeftShift) {
speed *= 1.5;
}
if el.is_key_down(Key::W) {
velocity.y+=speed;
}
if el.is_key_down(Key::S) {
velocity.y-=speed;
}
if el.is_key_down(Key::D) {
velocity.x+=speed;
}
if el.is_key_down(Key::A) {
velocity.x-=speed;
}
*pos += velocity * el.dt;
}
当前问题
缺少一些示例,例如包含绑定网格的示例、destroy_mesh() 的使用、模型加载、自定义着色器和自定义网格、纹理、宏、事件处理。似乎还有一点输入延迟,虽然延迟很小,但足以让人感到轻微的挫败感。模型加载可能存在内存泄漏?也可能缺少 Drop 的实现。
依赖项
~20–31MB
~531K SLoC