やあ子供たち。今日もみんなは何か進歩したかな。日々努力し、自ら進歩を重ねていかないとだめだぞ。一年経てばすごい差になるからな。
「描画に必要な全情報をFloat配列にして一気に流し込んでください。」これが昨今のOpenGLAPIの心であり、実際に実現されてきたことだ。OpenGLもかつてはこのようにはなっておらず、描画に必要な情報はいくつものこまごまとしたAPI関数呼び出しによってちまちま構築しなくてはならない時代があった。今やもう、その頃のOpenGLしか知らない人たちにはそろそろ引退してもらおうかと言わんばかりに様相が変わっているよ。
本題に戻ると、今日紹介するのは、これまで構築してきた、1)頂点座標リスト、2)ポリゴンを定義するための座標参照インデックス、3)参照インデックス並び法線リスト、以上の3つをもとに、glBufferData() APIにそのまま渡せるようなFloat配列を一瞬で作成できる便利な展開用の関数だ。恥ずかしながらソースは以下のようになった。
void ExpandTriangleIndexFormat( const vector< int >& indices, const vector< Vec3 >& poslist, const vector< Vec3 >& normals_index_aligned, vector< float >* pos_nor_array ) // indices と poslist, normals_index_aligned // で表記される3次元形状を、float配列に展開します。 { auto& l = *pos_nor_array; auto& m = indices; l.reserve( l.size() + m.size()*6 ); auto it2 = normals_index_aligned.begin(); for( auto it=m.begin(); it!=m.end(); ++it, ++it2) { const Vec3& p = poslist[ (*it) ]; const Vec3& n = *it2; l.push_back( p.X() ); l.push_back( p.Y() ); l.push_back( p.Z() ); l.push_back( n.X() ); l.push_back( n.Y() ); l.push_back( n.Z() ); }// idx }
いかがだろうか。出力のpos_nor_arrayには、各頂点ごとに、座標と法線が並んだものが入るよ、つまりこれを使って、glBufferData() がそのまま呼び出せてしまうという、そういう代物だよ。