lumino trail

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

開発状況 2021 #1

C++17対応

AndroidiOS のビルドツール回りのアップデートが必要だったのでずっと後回しにしてましたが、対応しました。これに伴い iOS11 以降が必須となります。

これからは Optional 等は標準ライブラリのものがりようできるようになるので、少しずつベースライブラリをダイエットできそうです。

OpenGL 廃止と DirectX12 対応 (と WebGPU)

0.10.0 リリース前にしては少し大きい変更です。

というのも OpenGL の RHI は Lumino の RHI 全体をモダングラフィックスAPIに寄せて最適化を続けていく過程で 実質使い物にならないくらいまでオーバーヘッドが大きくなってしまいました。 メンテナンスを続けるモチベーションも尽きているので、廃止することにしました。

ただそうすると大体5年以上前くらいの少し古いハードウェアでは Vulkan が動かないことが多いです。 その代わり…というわけではありませんが、DirectX12 を実験的に対応中です。Vulkan 非対応でも DirectX12 は対応しているハードもあったりするためです。 一応、ソフトウェアドライバを使えば実行速度はともかく、ほとんどの環境で絵を出すことはできるはずです。

DirectX12 はあと MSAA を対応すれば一通り実装は終えられそうです。

またこれの影響で Web 版が動かなくなりますが、WebGPU の検討を始めました。 Dawn で動かす予定です。

外部アプリへの埋め込みサポート中

HSP3 対応のため、実装中です。

例えば Windows ネイティブアプリケーションであれば、HWND を受け取ってそこに Lumino のシーンを描画できるようになります。

Builder イディオム実装中

C++ で疑似的な名前付き引数や柔軟な初期化を行うための Builder イディオムを試していました。

継承に対応しつつできるだけ実装をシンプルにできるよう試行錯誤していましたが、目途がついてきたので各クラスに順次実装を始めています。

// これまでの書き方
auto sprite = Sprite::create()
sprite->setPosition(0, 10, 0) // 座標 (0, 10, 0) へ表示する
sprite->setTexture(texture)   // 指定されたテクスチャを表示する
sprite->setSize(200, 100)     // 200x100 サイズで表示する
Engine::world()->add(sprite): // デフォルトの World へ追加する

// 新しい書き方
auto sprite = Sprite::With()
    .position(0, 10, 0) // 座標 (0, 10, 0) へ表示する
    .texture(texture)   // 指定されたテクスチャを表示する
    .size(200, 100)     // 200x100 サイズで表示する
    .buildInto();       // インスタンスを作成し、デフォルトの World へ追加する

開発状況 2020 #12

先月に引き続き、「天泣のライトレイン」の開発中に対応を見送った大きな問題を修正しています。

そのあたりが片付き次第次のリリースとなりますので、落ちてた Ruby 版 CI を復活させたり、インストーラの修正を行ったりしています。 C++ 版は VisualStudio のプロジェクトテンプレートを復活させることにしました。

次のリリースでは HSP3 版が入ってきますが、その裏で Rust 版も考え始めていたりします。 そのうち Lumino を Rust で書き直したくなっちゃいそうな気がする・・・。

また、本当に突然でびっくりしたのですが「Lumino のコミュニティはありますか?」という質問が来ました。 そのためまだ Beta ですが GitHub Discussions を試してみています。

さて今年はうれしいことに、ゲームシステム開発のお仕事の相談を何件かいただきました。 私が対応できる範囲で請けることにしたのですが、そのため Lumino の開発はペースダウンしています。 開発自体をやめるということは無いと思いますが、来年は今までのようにやりたい放題ではなくなりそうです。

とにかく早めにリリースしたいところ。来年の目標とか言わずに早々に。せっかくこれだけ大きなエンジンでゲームを安定して動かせるようになったんだから。

それでは、よいお年を!

開発状況 2020 #11

開発にキリをつけるのと、現状のデモを兼ねて「天泣のライトレイン」というタイトルを作成しました。

youtu.be

HSPプログラムコンテスト2020 に応募しています。

まだプレビュー版ってことで10%も遊べないんだけど、Lumino の機能はほぼ使い切って動かせたと思います。

Lumino もかなり大きなプログラムになってるけど、それを使って安定して動くゲームをリリースできるんだよ、っていう実績の意味も大きいかな。


さて、そっちの開発にウェイト置いていたので、先々月からの更新はほぼ不具合修正です。

辛うじて新機能と言えるのはHDRレンダリングに正式対応しました、くらいかな。

ただゲームの進行に問題が無いため見送った不具合も山盛りあるので、それらを解決したら 0.10.0 リリースになると思います。

いやもう 1.0.0 でいいかな。ゲーム作るっていう目的は達成できるし。

開発状況 2020 #9

HSP3のコンテストに向けてゲーム開発中です。間に合うかなぁ…。

というところなので、Lumino 本体の機能追加はあまり無く、不具合修正が多いです。

ただそんな中でも、シェーダの API は 1.0.0 向けのものを確定させました。 最も基本的な HLSL は次のような感じになります。(頂点シェーダは省略可能)

#include <Lumino.fxh>

struct VSOutput
{
    LN_VS_OUTPUT_DECLARE;
    // 独自の頂点定義を使いたいときはここに追加
};

VSOutput VSMain(LN_VSInput vsi)
{
    VSOutput output;
    LN_ProcessVertex(vsi, output);
    
    output... = ...;  // カスタムの頂点シェーダを書きたいときはここに追加
    
    return output;
}

struct PSInput
{
    LN_PS_INPUT_DECLARE;
    // 独自の頂点定義を使いたいときはここに追加
};

float4 PSMain(PSInput input) : SV_TARGET0
{
    LN_Surface surface;
    LN_ProcessSurface(input, surface);
    
    surface.Albedo = ...;  // カスタムのピクセルシェーダを書きたいときはここに追加

    return LN_ProcessPixel(input, surface);
}

technique Default
{
    ShadingModel = Unlit;  // 特定のシェーディングプロセスでのみ有効にしたいときは明示する
    pass Pass1
    {
        VertexShader = VSMain;
        PixelShader  = PSMain;
    }
}

Lumino はこれをもとに、スキンメッシュや法線マップ、シャドウの有無といった様々な組み合わせのシェーダを自動生成して使います。

実際にカスタムシェーダを使ってみたところはこんな感じです。

f:id:lriki:20200930214316p:plain

後はノードベースのエディタから出力できればいいんだけど…直近は厳しそう。

開発状況 2020 #8

先月に引き続き、ゲーム開発中です。

と言ってもシナリオ書いたりキャラデザしたりが主な作業になってるので、あんまり見せられる絵は無いです。

Lumino のコミット数だけは目に見えて減ってるけど…。

一方これまで撮ってきたいろんなスクリーンショットを、リポジトリのトップに並べてみました。 https://github.com/LuminoEngine/Lumino#screenshots

Particle の HorizontalBillboard 描画モード

水面上の波紋とかに使える描画モードを追加しました。

これでやっと雨のシーンが作れるかな。

Bullet の衝突検知整理

Bullet の衝突検知は次の2種類あります。

  • ContactStartedCallback, ContactEndedCallback
  • btGhostObject

実際にゲームを作り始めて、btRigidBody 同士の衝突は前者、btGhostObject 同士の衝突は後者でしか検出できないみたいな動きをしたので、 両方使ってなんかいい感じに検知できるようにしました。

Shader API の仕上げ

Skinning や Instancing、各種ポストエフェクトなど、そこそこ実用に耐えるような Shader API が出来上がってきたので、この辺りの書き散らしてきたコードを整理しています。

github.com

Hot Soup Processor (HSP) 版

供養の一環として、開発初期のころから思ってた「和製の言語にゲームエンジンを提供する」っぽいことをまたやってみてます。

HSPのコンテスト募集中だからそれに間に合えばいいけど…。

メインループを公開した書き方はこんな感じ↓

LNEngine_Initialize

LNTexture2D_Load "Sprite1.png", texture
LNSprite_CreateWithTexture texture, sprite

repeat
    running = 0
    LNEngine_Update running
    if running == LN_FALSE: break
loop

LNEngine_Finalize
end

メインループを隠蔽した書き方はこんな感じ↓

LNApplication_Create app
LNApplication_SetPrototype_OnInit app, *App_OnInit
LNApplication_SetPrototype_OnUpdate app, *App_OnUpdate
LNEngine_Run app
end

*App_OnInit
    LNTexture2D_Load "Sprite1.png", texture
    LNSprite_CreateWithTexture texture, sprite
    return
    
*App_OnUpdate
    return

Ruby 版と同じように C++ からの自動変換ですが、オブジェクト指向の仕組みを持たない言語でも拡張がしやすいように、API はプロトタイプベースでラップするように作り直したりしました。

開発状況 2020 #7

公私共にあわただしくなってきています。

ちょっと前に Lumino の供養がどうのとか言ってましたが、改めてちゃんと考えないとならんかもです。

と言ってもやることはちゃんと動くゲーム1本作り切ることなんだけど。

残り少ない時間で作り切れる規模と、自分の気が済むレベルのクォリティの天秤で、設計中です。多分ARPGやローグじゃなくて、簡単なアドベンチャーゲームになるかも。最近焦りがひどい。よくない。

Audio の安定化

ゲーム作るのに音が無いのは話にならんよね、ということで、プロトだけ作って長いこと放置していた音周りを作りこみました。

API はまだ安定していませんが、ランニングテストやらなにやらと修正を行い、オーディオグラフが安定して動くようになりました。

ポストエフェクト

先月時点でも、SSAO や Tonemap など、かなり量が増えました。ただこれらは個々に独立したエフェクトになっていたため、描画パスがかなり多くなり、特に OpenGL モードでは使い物にならないくらいにパフォーマンスを悪化させていました。

というところで以下のエフェクトをひとつのポストエフェクトクラスに統合しました。

  • FXAA
  • SSR
  • SSAO
  • Bloom
  • DOF
  • Tonemap
  • Vinette

3パスくらいで描けるようになり、パフォーマンスはかなり向上しました。

人体用の標準ボーン構造をサポート

Unity のまねっこ。

3Dモデルファイルやモーションデータファイルを読み込むとき、ボーンの名前や構造から部品を推測し、標準ボーン構造にマップする仕組みを実装しました。

これで、キャラクターの頭の向きを決めたり手にモノを持たせたりするとき、ボーンの名前を気にする必要がなくなります。

CharacterController

3人称視点でのキャラクター操作に使用できるコンポーネントを作成中です。

マウスとWASDキーで操作できるところまでは作成済みで、早めにゲームパッドも対応したいところ。

衝突判定用の Body 追加

2D用のは前に ARPG 設計してた時に作ったのがあるのですが、3D 用のは無かったので作りました。

BVH

主にモーションキャプチャ用のデータ保存に使われている BVH ファイルの読み込みを対応中です。

標準ボーンへのマップがまだ未熟なので、今のところは Mixamo からエクスポートしたファイルだけ動きます。

開発状況 2020 #6

今月は主にポストエフェクト周りを詰めていました。

機能として Fix するのはまだ先になりそうですが、次にリリース予定の Rendering モジュールがちゃんと動くことを検証するためにいろいろ試しています。

f:id:lriki:20200630233754g:plain

以下、動作確認済みのエフェクトです。

  • Bloom
  • DepthOfField
  • FXAA
  • Blur
  • SSAO
  • SSR
  • Tonemap
  • Transition
  • Vignette

Bloom と SSRユニットテストも組んだのでもうこれで Fix のつもり。

あと残り Godray を入れたら、作りたかったものは一通り動かせたという状態になる予定です。