本当は日中に執筆しようと思ったのだけれど、今から紹介するSinenが、MoltenVKによってMacに対応したことによって、Win/Mac/Linuxのクロスプラットフォーム対応になったことにワクワクしてしまって寝付けないので、思い切ってその勢いで記事を書きたい。
Sinenは、Vulkanをベースにしたクリエイティブコーディングフレームワークで、2D/3Dに対応し、フォントの読み込み、GLTFモデルの読み込みなど、基本的な機能は一通り揃っていて、シンプルでとても使いやすい印象を持つ。言語はLuaとC++に対応している。
2021年から開発が進められていた様子で、当初はOpenGLを使っていたのが、2023年頃にVulkanレンダラーに刷新された様子。ちなみに作者によると、Paranoixaという新しい描画基盤(RHI)を開発中とのことで、これにも期待していきたい。
Hello World (2D)
local hello_texture = {}
local hello_font = {}
local hello_drawer = {}
-- Create a texture
hello_texture = texture()
-- Create a draw2D
hello_drawer = draw2d(hello_texture)
-- Create a font
hello_font = font()
-- Load a font from file(96px)
hello_font:load("mplus/mplus-1p-medium.ttf", 96)
-- Render text to texture
hello_font:render_text(hello_texture, "Hello Sinen World!",
color(1, 1, 1, 1))
-- Set scale to texture size
hello_drawer.scale = hello_texture:size()
function update()
-- Draw
hello_drawer:draw()
end
3D Example (works)
Editor (Experimental)
API
Lua APIとC++ APIは、以下より確認が可能。
解説
APIやサンプルを見ていただければ分かると思うが、個人的には、クリエイティブコーディングの基盤としてちょうど良いミニマル具合1。というか、まさにこういうものがほしかったという印象を持っている。
現時点ではまだ、メッシュなどの中間レベルのAPIが存在していないため (現時点でVertexArray等でメッシュ等に対応済みの様子なので、追って追記。) 例えば、球体や立方体を描くにはGLTFなどのモデルのロードが必要で、円や長方形を描くには、画像を読み込むかImGuiなどのGUIを利用するしかないのだけれど、個人的には正直それで十分な気がしていて、Vulkan APIが使えるのでそのあたりは今後簡単に対応・拡張していけるのではないかと感じている。
3Dを扱う上では、まだライティングに関するAPIが本当に最低限しかないものの、シェーダには対応しているので、これも必要に応じて拡張していけると思うし、3D Example (works) のスクリーンショットを見ていただければわかるように、現時点でもいわゆるUnlit風な描画であれば特に問題なく使っていくことができる。
OpenGLからVulkanになって以降、ゲームエンジンのような厚いレイヤーのものは多くあるものの、こういうミニマルなものが少なかった印象なので、ProcessingやOpenFrameworks、Love2D 2 のようなものが欲しかったという層にはまさにクリーンヒットするフレームワークではないだろうか。
前述のメッシュやライティングについては、個人的に今後コントリビュートしていきたいという思いがあるので、是非今後に期待してほしいと思う。 (現時点でメッシュは対応済みの様子なので、使い方について追記していきたい。)
-
方向性は少し違うものの、ミニマルという意味では、Clojure/LWJGL3/BGFXで書かれたminimaxというゲームエンジンと近しいようにも思う。ちなみにminimaxは現時点でMacでしか動かないが、ライブラリ自体はクロスプラットフォーム対応のはずなので、こちらも今後自分自身がコントリビュートしてWin/Linuxでも動くようにしたいなと思っている。 ↩
-
Love2Dに関しては、最近同様のAPIでVulkan実装の3D対応版(LÖVR)がリリースされているので、こちらも比較対象とすると良いと思う。 https://lovr.org/ ↩