lumino trail

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

開発状況 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");

こんなイメージです。

開発状況 2018 #9

0.6.0 はプロジェクト作成の自動化と各プラットフォームでウィンドウ出して画面クリアまでが目標ですが、ぼちぼち形になってきました。

lumino-cli コマンドによるプロジェクト作成

こんなコマンドを打ちます。

$ lumino-cli HelloLumino

次のようなフォルダとファイルができます。

  • Assets フォルダ
  • Sources フォルダ
  • Projects フォルダ
  • Engine フォルダ
  • HelloLumino.lnproj
  • LuminoApp.sln

Assets フォルダ

音声や画像などのファイルを入れておくフォルダです。 デプロイ時にまとめてアーカイブ化して配布パッケージに含まれます。

Sources フォルダ

.cpp などのソースファイルを置いておくフォルダです。

Projects フォルダ

各ターゲットプラットフォームごとのプロジェクトファイルが入っているフォルダです。

中はさらに次のように分かれています。

  • LuminoApp.Android
  • LuminoApp.Html5
  • LuminoApp.iOS
  • LuminoApp.macOS
  • LuminoApp.Win32

例えば、LuminoApp.iOS と LuminoApp.macOS の中には xcode のプロジェクトファイル、LuminoApp.Win32 の中には VisualStudio のプロジェクトが入っています。

Engine フォルダ

Lumino のライブラリがまるごと入っています。

ビルド済みライブラリ or Luminoのソース一式(Cocos2d-x方式) は選べるようにする予定です。 プロジェクトごとに使うLuminoのバージョンを変えたり、Lumino自体をカスタマイズするような使い方を想定しています。

git などでバージョン管理するべきフォルダではないので、クローンし直しとかしたあとは $ lumino-cli restore コマンドで Engine フォルダを復元します。

HelloLumino.lnproj と LuminoApp.sln ファイル

HelloLumino.lnproj は lumino-cli が使う情報を保存しておくためのファイルです。

LuminoApp.sln は、メインの開発環境は VisualStudio を想定しているのでサッサとプロジェクト開きたいときにダブルクリックする用です。(後でよく考える)

今後について

結局 Unity や Cocos2d-x と似たフォルダ構成になりそうです。 最初はもっと違ったのですが、特に AndroidiOS あたりの開発環境の制約を受けてこんな感じになりました。仕様変更の回数がえげつないです。

えげつなさで痛めたメンタルを癒すのに他のモジュールをいじってたので、他もそこそこ進んでたりします。 Input あたりはもうすぐ出せそうだし、テストしやすさにかかわってくるので先行して入れちゃいます。

開発状況 2018 #8

クロスプラットフォーム対応が重いです。 ネイティブ Linux は見送るかも・・・。

プロジェクトの作成について

以前は Visual Studio にプロジェクトテンプレートを登録していましたが、新しくコマンドラインからプロジェクトを作れるようにしています。

create-react-app や vue-cli のようなイメージです。

後々、プロジェクト作成だけじゃなくてリリースやパッケージ作成もコマンドひとつでできるようにしたいところ。

Shader について

先月の記事にも書きましたが、プラットフォーム問わず HLSL で書けるように詰めています。

Windows, macOS, Emscripten は多分OK。これからモバイル系を検証していきます。

Audio モジュールについて

お盆明けくらいに突然 "音" が恋しくなったので、対応予定verはかなり先ですが先行して実装していました。

ハイレベルAPIは従来の Sound クラスや GameAudio クラスなどから変える予定はありませんが、ローレベルAPIとして WebAudio に似たオーディオグラフを自由に構築できるようにしています。 これで自由度の高いエフェクトの適用を狙っています。

特定の SE にだけエコーやリバーブをかけたり、逆にシーン全体や BGM にだけかけたり、いろいろできる・・・はず。

バックエンドは DirectSound, OpenAL, SDL あたり。 Emscripten でも動作確認済み。

ちなみに XAudio2 はやめようと思います。やめることでDirectXランタイムのインストールが不要になるので、エンドユーザーに面倒かけずに済む。かも。

開発状況 2018 #7

0.5.0 リリースしてました。

Nuget: https://www.nuget.org/packages/Lumino.Core/

Documentation: https://lriki.github.io/lumino/articles/documents/index.html

まだベースライブラリだけなので、特徴的なものは少ないです。

ですが、プロトタイプと言い訳するつもりではない最初のバージョンです。

Lumino.Core について

簡単に説明を。

Lumino.Core はグラフィックスやオーディオ以外の、非 UI 部分を担当するモジュールです。

重要なコンセプトは以下2つです。

というところで UTF-16 ベースの文字列クラスや、メモリ管理を参照カウントベースにしたコレクションクラスなど 車輪再開発の成果ぽいもの がたくさん詰まっています。

OpenGL で HLSL Effect してみる

HLSL のエフェクトフレームワークはちょっとシェーダ書きたいときには便利でしたが、DirectX11 では標準機能から外されました。 Effects11 のソースコードは公開されていますが、古いコードの移植支援ということで推奨はされていないようです。

また Lumino としては使いやすい Shader インターフェイスを考えるのは長い間課題でした。

理想としては DirectX9, 11 あたりの HLSL Effect コードを書いておけば、OpenGL でも macOS でも、API や環境を問わず動かせるようにしたいです。 ついでに、事前コンパイルしなくてもちょっとした動作確認やサポートツール開発のために、ソースファイルを入力してプログラムオブジェクトを作ったりしたい。

Cg のサポートが終了してから色々と調べまわっていましたが、glslang + spirv-cross + technique構文の自前パース に落ち着きそうです。(余談ですが、仕事でメンテしてる構文解析ツールのレガシーコード感にむしゃくしゃして作ってしまった解析ライブラリが、ガベージでコレクションなことにならなくて済みそうです)

あと glslang の HLSL フロントエンドが強かったです。HLSL5 も使えるんだね。

↓ HLSL で書いた大気シェーダを OpenGL で動かしたところ。

f:id:lriki:20180731201936p:plain

開発状況 2018 #5

なんだか最近、仕事でも趣味でもあんまりコード書かない気がします。

Core モジュール開発中

0.4.0 までのコードに対してドキュメントとテストを付けてたり、AndroidEmscripten でビルドできるように修正を入れたりしています。

ただ動くだけじゃなくて、そこからちゃんと使えるようにするまでの壁が厚いです。

NuGet にプレビュー版を上げました

Lumino.Core 0.5.0-pre2

Visual Studio 2017 の C++ 用です。 [NuGet パッケージの管理] などでインストールしたら以下のようなコードではろーできます。

#include <iostream>
#include <LuminoCore.hpp>

int main()
{
    ln::String str = u"Hello, Lumino!";

    std::cout << str << std::endl;

    return 0;
}

なんの宣伝もしてないのにダウンロード数が上がってるんだけどなんだろう?botかなぁ?