今週の進み具合 #4

あけましておめでとうございます。2014年もよろしくお願いします〜。 年末からお正月にかけて実装したことを振り返っていきます。

進み具合 (2013年12月28日 - 2014年1月10日)

エフェクトパラメータを実装しました。実装では、シェーダリフレクションでリンク済みのシェーダプログラムオブジェクトから Uniform Block を取得して、必要な Uniform Buffer オブジェクトを作成しました。これらを実装するにあたって、エフェクトリフレクションも追加しました。

Uniform Block

OpenGL の Uniform Buffer は Direct3D 11 における定数バッファ(Constant Buffer)に相当します。 今回は旧来の Interface Block を使用していない Uniform 変数には対応せず、Uniform Block のみサポートすることにしました。 旧来の GLSL Uniform 変数は次のような記述です:

// Not supported
vec4 Diffuse;
vec4 Specular;
vec4 Ambient;

今回対応したのは次の Uniform Block を使用した記述です:

// OK
uniform Material {
    vec4 Diffuse,
    vec4 Specular,
    vec4 Ambient,
};

GLSL 上では Uniform 変数をブロック(Interface Block)で囲むだけなので、古い GLSL コードから移行が簡単です。

また Uniform Block をサポートしたことで次のような POD な値を直接エフェクトパラメータ(定数バッファ)にコピーすることが可能になりました:

struct Material
{
    Color Diffuse,
    Color Specular,
    Color Ambient,
};

Material material { Color::White, Color::White, Color::White };

auto parameter = effectPass->Parameters("Material");
parameter->SetValue(material);

Uniform Block を使用したことで、旧来の glUniform を使った場合より、バッファへのコピー回数が減ることが期待できます。

現世代(Direct3D 11 世代)のグラフィックス API と対応がとれて実装しやすかったです。Uniform Buffer オブジェクト(GL_UNIFORM_BUFFER)の扱い方自体は、OpenGL における Vertex Buffer(GL_ARRAY_BUFFER) や Index Buffer(GL_ARRAY_ELEMENT_BUFFER) と変わりなく、扱いやすかったです。

今週の実装予定

エフェクト周りが一段落したので、グラフィックスで残っているのは、テクスチャとレンダーターゲットになりました。今週はテクスチャを触っていきます。 エフェクトもそうですが、テクスチャは特にアセットと深い関係にあるので、アセットパイプラインについてもぼちぼち考えていきます。

昨年、OpenGL を触っていたときにマルチテクスチャ・マルチレンダーターゲット周りで痛い目にあったのでバグを混入しないよう気をつけます(汗)

(次回 "今週の進み具合 #5" はあるのでしょうか…。)

Leave a Reply