3个版本
0.0.2 | 2019年11月30日 |
---|---|
0.0.1 | 2019年11月30日 |
0.0.0 | 2018年12月31日 |
#353 in 图形API
92KB
1K SLoC
ggraphics
一个用Rust编写的轻量级2D图形渲染库。
目前,这基本上是ggez
的实现细节。它并不是真正设计来作为通用用途的,但其他人可能对此感兴趣(例如,其他人使用Rust制作2D游戏或游戏引擎)但希望做出与ggez
不同的设计决策。所以,这就是它的样子。
设计
目前它是一个简单的2D(几乎)四边形渲染器,使用OpenGL。它使用glow
作为薄的OpenGL可移植层,采用类似于Vulkan/WebGPU的渲染过程,其中包含管线和绘制命令。
目标
- 在桌面和Web上通过WASM进行工作,不需要额外努力
- 在OpenGL 4和类似的API上工作 -- OpenGL ES 3,WebGL 2。
- 绘制纹理四边形和可能任意的网格。
- 支持用户定义的着色器和渲染过程。
非目标
- 绝对跨平台,无需额外努力。奇怪的平台总是需要额外的工作来构建和集成。这应该使这个过程变得容易,但不需要使其变得无形。
- 通用。不惜一切代价避免成功。大多数人不需要直接使用这个。
- 支持所有硬件。抱歉。
- 包括窗口、输入等。这些是其他工具的工作。
- 复杂的3D渲染。如果这个库足够可扩展,以至于你可以添加自己的东西,那会很好,但当前,“带有着色器的纹理几何体”是最低可接受的产品。
- 绝对顶级的性能。它不应该无故缓慢,应该足够快,足以被认为是相当不错的,但不需要无故地快。
可能某天目标
- 将移动设备作为一级目标
- 使用
gfx-hal
、rendy
、wgpu
或其他下一代图形可移植层。目前,可移植性并不存在。 :-( - 在OpenGL 2和类似的API上工作 -- OpenGL ES 2,WebGL 1。
许可证
MIT
关于可移植性的说明
glow
尽力使不同OpenGL变体的差异不可见,但这基本上是不可能的,因此我们需要注意以下事项。
着色器
WebGL 2使用GLSL ES 3.00,有一些小的限制。WebGL 1使用GLSL 1.00 ES,有一些更大的限制。参考资料:https://www.khronos.org/registry/webgl/specs/latest/2.0/#4.3 和 https://www.khronos.org/registry/webgl/specs/latest/1.0/#4.3。根据这些规范,这些限制是严格的,所以WebGL 2不应该接受GLSL ES 3.10。(当然,我敢打赌它有时还是会接受,但是去他的。)所以,为了制作在任何地方都能工作的着色器,首先将着色器编写为针对WebGL,然后它应该可以在其他目标上运行。
GLSL ES 3.00基于OpenGL GLSL 3.30,见https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf第1.1部分。它移除了一些东西,但也增加了一些其他东西,从像“行续行”这样简单的到像“GLSL ES 1.00兼容性”这样广泛的东西。
维基百科声称OpenGL 4.3涵盖了OpenGL ES 3.0的所有特性,因此WebGL 2.0也是如此。查看GLSL规范,3.30是4.00的严格子集,4.00是4.10的严格子集。4.10到4.20和4.20到4.30说“没有特性被弃用”,但是有一些小的破坏性更改(使变量作用域更合理,使#ifdef行为更像C++并因此更疯狂)--然而,GLSL 4.3明确允许你指定#version 300 es
并从中得到GLSL ES 3.00着色器。
太棒了!如果你编写OpenGL ES 3.0着色器,并且它们在WebGL 2上工作,那么你应该可以在任何地方使用它们。
依赖关系
~3–16MB
~220K SLoC