今回はレンダリング処理で使いまわしのできる
ようにするものを書こうかと思います。
レンダリング関係のプログラムは
重複したコードをもっとも生む
ところです。
重複したコードをできるだけ減らす努力をしたいものですね。
早速コードです
// シェーダークラス
class IShader
{
public :
virtual ~IShader() {}
// パラメータ設定類
};
// レンダリングディスクリプタ
class IRenderDesc
{
public :
virtual ~IRenderDesc() {}
virtual bool set( IShader& shader ) = 0;
};
// レンダラ
class IRenderer
{
public :
virtual ~IRenderer() {}
virtual void render( const IRenderDesc& desc ) = 0;
};
// テスト
class TestRenderDesc : public IRenderDesc
{
public :
// レンダリングに必要なパラメータ
bool set( IShader& shader )
{
// シェーダーパラメータ設定
}
};
// 使用例
void TestCharacter::draw( IRenderer& renderer )
{
TestRenderDesc desc;
desc.model = _model;
desc.animation = _animation;
desc.frame = _frame;
desc.matrix = _matrix;
// ほかのいろいろのパラメータ設定
renderer.render( desc );
}
ポイント
1:複雑な(面倒な)シェーダーに送る処理を記述しておく。
2:シェーダーに送る処理を記述したクラス変数にパラメータを設定してレンダラーに送る。
3:描画される
シェーダーの種類が増えるたびに記述するクラス数は増えますが、
ここは汎用的にしないほうが、そのシェーダーにどのパラメータ
が必要なのかをわかりやすくする
汎用や凝り性はやりすぎると混乱を招きます。
複数人でやるとさらにカオスな状態に・・・
シェーダーのことは気が向いたらやろうかと思います。
最終更新:2008年11月09日 19:43