今週の進み具合 #17 - ゲーム開発ことはじめ

1ヶ月も更新が途絶えていました(汗) もうめっきり涼しくなって今夏も終わりに近づいています。8月中にやったことを振り返ってみます。

(動画) 新しく作り始めたゲームのプロトタイプ

進み具合 (2014年7月28日 - 8月30日)

  • 定数バッファ API の追加
  • アセットのキャッシュ
  • プロジェクトテンプレートを生成するスクリプトの修正
  • Experimental ディレクトリの追加
  • GLSL シェーダの組み込み
  • ビルトインシェーダのキャッシュ
  • 新しくゲームのリポジトリを作った

アセットのキャッシュ

1度ロードしたアセットをキャッシュするようにしました。テクスチャやシェーダなどのアセットを読み込むときにファイル I/O の回数が極端に減って速くなりました。加えて、ゲームエンジンが提供するシェーダをすべてソースコードに埋め込んでビルトインシェーダ(Built-in shader)にしました。ソースコードのサイズは大きくなりますが、ファイル I/O を利用しないためランタイムの読み込みがとても速くなります。ビルトインシェーダについても、1度コンパイルしてリンクしたエフェクトはキャッシュするようにしました。

GLSL シェーダをビルトインシェーダとして組み込む

GLSL シェーダファイルを C++ のソースコードに埋め込みやすいヘッダファイルとして出力する Python のスクリプトを作りました。例えば、次のような GLSL シェーダがあります。

#version 330

// {xy__} = Position.xy
// {__zw} = TextureCoord.xy
layout(location = 0) in vec4 PositionTextureCoord;

out VertexData {
    vec2 TextureCoord;
} Out;

void main()
{
    gl_Position = vec4(PositionTextureCoord.xy, 1.0 1.0);
    Out.TextureCoord = PositionTextureCoord.zw;
}

今回作ったスクリプトを使って、このシェーダから次のような C++ のソースコードをヘッダファイルとして出力します。

char const* Builtin_GLSL_VertexShader =
"#version 330\n"
"layout(location=0)in vec4 PositionTextureCoord;\n"
"out VertexData{\n"
"vec2 TextureCoord;\n"
"}Out;\n"
"void main()\n"
"{\n"
"gl_Position=vec4(PositionTextureCoord.xy,1.0 1.0);\n"
"Out.TextureCoord=PositionTextureCoord.zw;\n"
"}\n";

以前までスプライトバッチや FXAA などのエンジンが提供するシェーダはランタイム時にファイルから読み込んでいましたが、すべて C++ のソースコードに埋め込んでファイル IO を使わないようにしました。

新しいゲームのリポジトリ

新しくゲームを作り始めました。ゲームコードはすべて GitHub で公開しています。今後はゲームを作りながら、その都度ゲームエンジンのほうも更新していきます。

今週の予定

  • 爆発エフェクトの追加
  • 背景の作成
  • レンダラのリファクタリング

(来週は間を空けず "今週の進み具合 #18" を更新できるでしょうか。お楽しみに。)

Leave a Reply