2013年2月9日土曜日

libWRP-GLEW create_model


実装中のlibWRP-GLEWについてのちょっとメモ。

libWRP-GLEWではシングルトンのglewクラスのインスタンスを通じてOpenGL APIやデータを扱います。モデルデータを作ってレンダリングするには、

  auto m = glew.create_model<float, 2>(
    { {{ -.5f, -.5f }}
    , {{  .5f, -.5f }}
    , {{  .5f,  .5f }}
    , {{ -.5f,  .5f }}
    }
  );

とするとモデルデータ(≈GLSLにぶん投げる頂点データ群)を生成できるようにしてみました。この例では2D頂点の集合を初期化リスト形式でlibWRP-GLEWのcreate_modelに放り込んでいます。もちろん3D頂点集合も同形式で対応。

レンダリングは、

  glew.invoke(m);

で。絵しか扱わないならdrawやpresentやrenderなんて名前でも良いけれど、stream out的な事や数値計算をGLSLで行う事も含めた広い意味にまで一般化してinvokeにしました。DirectComputeの影響?ハテサテ(╹◡╹)

create_model<class TELEMENT_TYPE, size_t TELEMENT_SIZE>std::vector<std::array<TELEMENT_TYPE, TELEMENT_SIZE>>を関数のパラメーターにしているので先の初期化リストとなります。波括弧の付け方が慣れないとややこしいのですが、その他はすっきりしていると思います。

この結果 auto m に返されるのは model_v 型で、先のcreate_modelはそのプライベートctorをfriendにより呼び出しています。model_vのctorではごにょごにょ頂点データから頂点バッファーを生成しているだけです。

渡されたTELEMENT_TYPE(先の例ならばGLfloat≈float型)から、OpenGL APIのglVertexAttribPointerに渡す頂点属性(例えばGL_Float)もboost::mplで推論する様にしましたので何かと便利が良いです。C++の組み込み型と互換性のあるu?int(8|16|32)_t,float,doubleの基本的な8種類の他は対応して居ませんけれど(╹◡╹)

引き続いて、libWRP-GLEWのcreate_modelにインデックスバッファー対応のオーバーロードも用意して、3Dモデルデータのファイル読み込みを実装したら、少しは実用化に接近。それからテクスチャー周りを実装すればGLSLで遊ぶにはまあまあ十分な状態になるかな。インスタンシング対応はさらにそのあとにでもちょちょいと(╹◡╹)

なお、いまのところ3Dモデルデータのファイル形式はOpenCTMに対応すれば楽で良いはず、と認識しています。.plyのコンバーターとかもあるしね。

0 件のコメント:

コメントを投稿