openFrameworks3Dプログラミングの勉強がてら、@h_doxasさんが運営するwgld.orgのコードをoFで記述してみました。oFで凝った表現をしようと思ったらおそらくシェーダーと出会うことになるかと思うのですが、oFでは頂点データや座標変換行列を自動的にシェーダーに送信する仕様になっていたり行列を掛け合わせる順番が異なったりとそこそこややこしいと感じたのでまとめておきたいと思います。こちらがありがたい参考資料。3Dプログラミングにおける基礎知識はどの言語で実装する際にも共通なので、まずはこれらの資料を読んでみてOpenGLでのレンダリングプロセスやモデルデータの描画方法を理解してみることをおすすめします。丁寧に解説してくれています。~・シェーダープログラミングの意義とその実装こちらが今回のソースコードです。(今後もサンプルは追加する予定。150で実装しています。150への書き換えはこちらを参照してください。以下、01-simpleModelのコードを例に簡単に解説を加えたいと思います。ofApp());}まずは、main.cppです。150を使えるように設定しています。time;};次に、ofApp.hです。描画するモデル数の定義と各種インスタンスの生成を行っています。ここではofVboMeshを使用しています。ofMesh、ofVbo、ofVboMeshの違いはこちらのサイトに大変分かりやすくまとまっています。0.0);}ここからofApp.cpp。ここでは、深度テストの有効化とシェーダの読み込み、そしてカメラの設定をしています。詳しくはwgld.orgの方を参照してほしいのですが、NearClipとFarClipを指定しています。Debugの部分はカメラの各種情報の取得方法です。必要に応じて適宜利用してください。ofGetElapsedTimef();}update()は特になにもしていません。時間を取得しているくらい。400);easyCam.end();}肝心のdraw()部分です。・モデルの描画となっています。(モデル変換行列では座標の移動と回転処理を加えています。※処理を行う順番に注意!!!!)注意しなくてはならないのは、mvpMatrixを生成する際に行列を掛け合わせる順番です。通常は(行列が列オーダーの場合)mvpMatrixはp*v*mで求まるのですが、oFでの行列ofMatrix4x4は行オーダーであるため掛け合わせる順番が逆になり、m*v*pで求まります。oFではshader.begin()とshader.end()で囲んだ部分に何かdrawすれば、その頂点データは自動でシェーダーに送られます。ここではわかりやすいようにsphereのメッシュを取得してvboMeshに格納し、頂点色を付加して描画しています。この自動でやってくれる部分、普段は便利なのですが実際に自分で記述しようとしてみるとその仕様を把握するのに少し戸惑ったりしました(僕だけかもしれませんが。)しかし、仕様を把握してしまえば簡単に頂点情報を送信できることの恩恵を受けることができます。shaderに送信しています。shader内で掛け合わせることも可能です。目的に応じて使い分けてください。shaderはさらにシンプルで、受け取った頂点色をそのまま最終的なアウトプットカラーに代入して送信しているだけです。これで晴れて球体がレンダリングできました。ライティング処理を行っていないので非常にのっぺりとしたレンダリング結果になっているかと思います。他のサンプルではwgld.orgの通りにライティングを行っているので試してみてください!!ではでは。rystylee.com。