lumino trail

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

開発状況 2020 #5

ここ1カ月くらいはまた RPGツクール 周りで活動してます。

こちらはペース落としてますが、リファクタリング中心にちょっと変更が入ってます。

Shader

Shader は結構古いモジュールになっていて DirectX9 と互換持たせた API をずっと引きずっていました。

特に、Uniform 個別に値を設定する仕組みになっていたため、UniformBuffer を使ってまとめてデータを GPU に送るスタイルとのミスマッチがひどく、処理速度を落としていました。 基本的にユーザープログラムから Shader に対して値を設定するには Material を通すので、Shader 自体の使いやすさはそれほど重要ではないだろう、ということで、全部 UniformBuffer を使うようにしました。

またリフレクションについても、Vulkan バックエンドはリフレクション情報をコンパイル済みシェーダと一緒に外部から渡すのに対して、OpenGL バックエンドは glGetProgramiv() などを使用して内部で解析してました。 それなのでバックエンドの種類によってデータの方向が異なる負担を全部 Shader クラスが受け持っていてかなり複雑度が上がっていました。ので、シェーダ関係の情報はすべて外部から渡すようにしました。

あと Lumino の Shader は、DirectX9 の Effect みたいな仕組みを持っていて、technique 構文でシェーダプログラムをグループ分けして管理できます。

Sprite.fx

technique Forward_Geometry_UnLighting
{
    pass Pass0
    {
        VertexShader = VS_ClusteredForward_Geometry;
        PixelShader = PS_Main;
    }
}
technique Forward_Geometry_UnLighting_Instancing
{
    pass Pass0
    {
        VertexShader = VSI_Main;
        PixelShader = PSI_Main;
    }
}

ただ今日日この構文をサポートしているシェーダコンパイラは無いので、technique 部分に限りコンパイラを自分で実装しています。 …ですが、やっぱりメンテの負担が大きいし、特にコンパイルエラーがすごく不親切なので微妙に使いづらい。

ということで YAML 方式で書けないか考えています。

Sprite.fx

@module
techniques:
    Forward_Geometry_UnLighting:
        passes:
        -   Pass0:
                vertexShader: VS_ClusteredForward_Geometry
                pixelShader: PS_Main

    Forward_Geometry_UnLighting_Instancing:
        passes:
        -   Pass0:
                vertexShader: VSI_Main
                pixelShader: PSI_Main
@end

なんかごちゃごちゃしてる気がするなぁ…。実装はしたけど、しばらく様子見。

Rendering

一応次のリリースで正式公開する予定のモジュールなので、今まで書き散らしてきたものを整理しています。

Lumino の中でもトップクラスに複雑なモジュールですが、ユニットテストと CI がちゃんと仕事してくれて、安定してリファクタリングできています。

Effect (Particle)

↑の整理に関連して Rendering モジュールの中のレガシーな機能に依存している人たちを修正して回っています。

で、パーティクル周りはちょっと寄り道して、ちょっと前に メッシュ描画の Instancing に対応したのでその仕組みを入れて高速化することにしました。

f:id:lriki:20200531131537g:plain

処理負荷は従来の 70% くらいになりました。座標変換を全部 GPU に持って行けた、ってところだとこんなものか…。メッシュパーティクルだともっと効果出そう。

あと、パーティクルの軌跡も作成中です。

f:id:lriki:20200531132013g:plain

UE4 のコードを参考に効率的なデータの使いまわしを実装した…つもりだけどなんか全然別物になっちゃった気がする。まぁ、VisualStudio のデバッグ実行中で 500FPS 出てるなら上出来じゃないかな…。