lumino trail

ゲームエンジン作ってます。Github:https://github.com/lriki/Lumino Twitter:https://twitter.com/lriki8

開発状況 2019 #4

平成最後ですがいつも通りです。

master ブランチにマージした CI ビルドが終わったら 0.8.0 リリースです。この記事投稿してる時も多分どっかのサーバでガシガシやってると思います。

Graphics

OpenGL ドライバで fix です。API は DirectX11 に近い感じで着地となりました。

シェーダは HLSL5 で書いて、Web やモバイルでも動かせちゃったりします。

Vulkan は Experimental ですが一応使えます。GPU が対応していれば・・・。

チュートリアル

未完成 & 穴だらけですが、チュートリアルを作る気持ちだけ公開しました。

まだまだ変更入れたい予定です。

今後について

次の 0.9.0 はトランスコンパイラの実装です。clang 使ってコード解析してラッパーを自動生成するやつです。

ただそれやる一方で、ちょっとゲーム1本くらい作ろうと思います。C++で。

アクションにするかローグライクにするか、色々ネタがたまってるからどうなるかは計画中ですが、できればコードは OSS にして Lumino の Example project にしてみたいと思います。

開発状況 2019 #3

今月は主に、チュートリアルで使う2D物理演算とUIシステム、それと Vulkan 対応を進めていました。

Font

これまではフォントを使うときは必ずプログラムのどこかでフォントファイルを登録する必要がありましたが、 mplus フォントをビルトインフォントとして使わせていただくことにしました。

ただやっぱりファイルサイズが大きいので、ひとまず Lumino をライブラリ単体として使うときは ASCII サブセットのみの対応としておきます。 (lumino-cli を使ってデプロイするときは日本語ちゃんと使えるように Asset をくみ上げる予定)

Rendering

UI要素を描画するために必要な機能をいくつか追加しました。 特に、背景と枠。

Animation

プロパティアニメーションを実装しました。 ただ当初はチュートリアルで使おうと思っていましたが、多分直近では不要になりそうなのでちゃんとテスト書いて公開するのはちょっと先になります。

Physics

2D物理システムについて、レイキャストやコリジョンコールバックなど、ゲーム開発に最低限必要な機能を実装しました。 ドキュメントが全然足りてないのが最大の問題・・・。

Graphics

Windows では Vulkan がかなりいい感じに動くようになってきました。 次は macOS, Android あたりで対応したいけど、0.8.0 に向けての Vulkan 対応は Graphics モジュールのモダンAPI対応によるインパクトを見るのが主な目的なので、Windows 以外はもう少し先です。

今後について

Graphics モジュールの API がほぼ固まったので、0.8.0 リリースに向けて仕上げていきます。まぁ、主にユニットテストとドキュメントですが。

Vulkan をどうやって使ったかはどこかでブログ書いておきます。っていうか、残しておかないと自分が忘れる・・・。

開発状況 2019 #2

ようやくといいますか、やっとといいますか、チュートリアルを書き始めました。 Lumino 全体を浅く触りながら、2D のアクションゲームを作るものです。

実際に書いてみるとゲームエンジンとしてちょっと足りてないところが出てきたので、今月のコミットはいろいろなところに手が入っています。

Audio

0.4.0 以降、とりあえず音鳴ったわーいで止まってたものを、ちゃんと BGM と SE 同時再生できるようにしたり、キャッシュを実装して効率よくたくさんの SE ならせるようにしたりしてました。

新しい Audio システムは WebAudio ライクなノードベースで柔軟にエフェクト掛けられるすごいやつですが、このへんの API をちゃんと決めてテストできるのはまだ先になりそうです。

Physics

Box2D を組み込んで、2D シーン用の高速な物理演算システムを作りました。

Unity などのゲームエンジンと Box2D では API にかなり差がありますが、Lumino は 3D と同じく Unity 寄りに実装してあります。なので、単なる薄いラッパーではないです。

UI

画面に文字を表示するための UITextBlock を実装しました。使い方は WPF の TextBlock をイメージしています。

というより、Lumino の UI モジュールは全体的に WPF をイメージしたスタイリングやレイアウトシステムとなっています。

Animation

プロパティアニメーションを実装途中です。スキンメッシュアニメーションと同じようなインターフェイスでオブジェクトのプロパティを変更できるようになります。

とりいそぎ、チュートリアルでのスプライトアニメーションで使う予定です。

Graphics

UITextBlock の実装のため、スプライトベースのテキストレンダリングを実装しました。0.4.0 以降はとりあえずテクスチャへのBlitだけで実装していましたが、これからはリアルタイムに描画できるようになります。

あと、Vulkan を引き続き組み込み中です。一応次の 0.8.0 は Graphics モジュールを固めて出す予定なので、100% ではなくてもせめて公開 API へのインパクトの有無くらいはつかめるくらいには入れておきたいです。

今後について

チュートリアル完成と Vulkan 組み込みが二大柱です。 次の 0.8.0 はこの 2 つを目標にリリース予定です。

開発状況 2019 #1

いつのまにか、このブログを始めてから2年経ってました。 コードはすごく変わりましたが、機能的にはほとんど進みが無いように思います。 リファクタリングやりすぎ案件の事例です。

v0.7.0 リリース

こっそりしてました。

ただ、HLSL シェーダをいろいろなターゲット向けにトランスパイルする機能を仕上げただけなので、これだけで何かできるってわけではありません。なのでこっそり。

Graphics

Vulkan の対応を進めています。

これまではずっとレガシーDirectXOpenGLでした。

しかし、次の 0.8.0 で fix したい Graphics 機能のために、少なくともモダングラフィックス API の「クセ」みたいなものをちゃんと知った上で実装しないと また大きな作り直しをしそうなので、ここで対応することにしました。

Mesh

ふと、丁度一年くらい前に作っていたボクセルモデルの自動生成をまた進めたくなったので 3D 周りに手を入れ出しました。 ただ Vulkan 対応がすごく重かったので、こっちはとりあえず .obj と .pmx を読めるようにしただけです。

今後について

Vulkan がんばります。

開発状況 2018 #12

リポジトリの Readme で「実際にゲームを作りながら」と言ってますが、ぼちぼちゲームを作るための機能がそろってきたので制作を始めました。

と言っても何年も前にプロト公開した作品のエンジン部分を乗せ換える作業がメインです。

あとはコミットログを遡って、今月やったことを思い出してみます。

Audio

Sound クラスと GameAudio クラスを実装しました。 基本的な使い方は 0.4.0 のものと変わりませんが、内部実装は Web Audio ライクなノードベースのサウンドシステムの上に作られています。 ので、今後はエコーやノイズなどのエフェクトを適用できるようなインターフェイスを追加する予定です。

あと、Ogg vorbis ファイルを再生できるようにしました。

Graphics

Texture2D クラスに、

  • 単色塗りつぶし (clear)
  • 他のテクスチャからのビットマップ転送 (blit)
  • 文字列描画 (drawText)

を追加しました。 プログラム内での簡易的なテクスチャ編集に使います。

Tilemap

2D ゲームのマップなどでよく使われる機能です。 ロードマップ にはありませんが、ちょっと2Dなゲームを作りたい気持ちが出てきり、↑で制作中のゲームで必要になってきたりしたので実装中です。

ImageEffect

いわゆるポストエフェクトです。Unity の ImageEffect と同じです。 今回は2つ作りました。↑の動画でも使っています。

ToneImageEffect は画面全体の色調を調整します。セピア調のイメージを作ったり、フェードイン・フェードアウトの演出に使用できます。

ScreenBlurImageEffect は前回フレームの描画内容を重ね合わせる単純な方法で画面全体のブラーを表現します。

Scene

主にデバッグ用に、マウスでカメラを操作するための CameraOrbitControlComponent を実装しました。

これは Camera オブジェクトにアタッチして使う Component です。以下のようにするだけでぐりぐりできます。

Engine::mainCamera()->addComponent(CameraOrbitControlComponent::create());

Physics

bullet ライブラリをビルドシステムに追加しました。 とりあえず PhysicsWorld を作れるようにしただけで、まだ何もできません。

Shader

実際に本番環境で動かすと出てくるバグからはどうしても逃げられないようで、 あとはドキュメントだけで次のバージョン出せるぞ!とか思っていたら、↑で制作中のゲームで問題が出てきました。 バグっていうか単純な検討不足だったんだけど・・・。

とりあえずこんな↓対策にしました。

今後について

Shader モジュールに対してちょっと変則的な実装を加えたので、1月一杯くらいは様子見です。

他はゲーム作りつつ実装を続けていきます。

開発状況 2018 #11

次verではシェーダコンパイラの対応を行う予定ですが、相変わらず別モジュールの実装に浮気中です。

といっても fix できたものも無いので、コミットログをざっとさかのぼります。

Sprite

2D イメージを表示するためのアレです。

0.4.0 では配置する座標空間が異なる Sprite2D, Sprite3D がありましたが、 それぞれ

  • Sprite2D → UISprite
  • Sprite3D → Sprite

となりました。

2D 系は基本的に UI モジュールに押し込める感じで、ほかにもサフィックスとして 2D,3D とついていたものは同じように変更されます。

ImageEffect

適用先が増えました。

  • Camera
  • OffscreenRenderTarget
  • Window 全体
  • UIサブツリー

いろいろなところにエフェクト掛けられるようになります。

Archive

画像や音声など、配布するリソースファイルを1つのファイルにパックするアレです。

抽出防止のために暗号化掛けますが、以前のものはライセンスのソースがなんかパッとしなかったので zlib を参考に書き直しました。

ちなみに zip 圧縮も掛けようとしましたが、よく調べてみるとランダムアクセスが困難だったので、圧縮はやめました。

Audio

0.4.0 で公開していた Sound クラスとバックエンド (XAudio, OpenAL など) の間に、Web Audio ライクなノードベースのシステムを作りました。

これでかなり細かくサウンドエフェクトの適用個所を制御できるようになります。エミッタ個別でノイズ掛けたり、シーン全体にエコー掛けたり。

0.7.0 (Shader) について

前回の内容で、各プラットフォームの動作確認中です。 あとは

  • macOSiOS で動作確認
  • テンプレートプロジェクトの修正
  • ドキュメント更新

あたりかな。

開発状況 2018 #10

0.6.0 をリリースしました

Documentation: https://lriki.github.io/lumino/articles/documents/GettingStarted/getting-started.html

コマンドラインツールでプロジェクトを作成し、各プラットフォームでバックバッファをクリアするまでです。

※テクスチャのクラスとかも入ってたりしますが、これらはまだテストされていません。

これでひとまずクロスプラットフォーム対応を謳えるようになった気がしますが、できることはほとんどないのでまだそんなに面白くはないです。

このリリースは今後の開発のベースラインとして、本当にスタートラインに立つための動作保証を行ったものとなります。これでいろいろ安心して開発を進められるはず・・・。

Azure Pipelines を使いました

ターゲットプラットフォームも増え、フルビルドの時間も馬鹿にならなくなってきたので、毎回 5 ターゲットをテストするのはとても大変です。

ということで、ようやく CI を導入しました。リポジトリの Readme にバッジが載ります。

0.7.0 (Shader) 実装中

次はシェーダのトランスコンパイラです。

以前の記事に書いた通り、HLSL で記述されたシェーダを SPIR-V 経由でいろいろ変換します。

変換は lumino-cli コマンドから行います。

lumino-cli fxc shader.fx -o shader.cfx

プログラムからは Shader クラスの create 関数を使います。

auto shader = ln::Shader::create("shader.cfx");

こんなイメージです。