#opengl #glfw #graphics #gamedev

bin+lib chaos-framework

游戏框架,用于创建游戏!

2 个版本

0.1.2 2024 年 8 月 3 日
0.1.1 2024 年 7 月 9 日
0.1.0 2024 年 7 月 9 日

#217 in 图形 API

Download history 196/week @ 2024-07-08 1/week @ 2024-07-15 152/week @ 2024-07-29 14/week @ 2024-08-05

176 每月下载量

MIT/Apache

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