3个版本

0.0.2 2019年11月30日
0.0.1 2019年11月30日
0.0.0 2018年12月31日

#353 in 图形API

MIT许可证

92KB
1K SLoC

Rust 1K SLoC // 0.1% comments GLSL 143 SLoC // 0.2% comments Shell 5 SLoC // 0.4% comments

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-halrendywgpu或其他下一代图形可移植层。目前,可移植性并不存在。 :-(
  • 在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.3https://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