CMeshを変更しよう(3)

SVertexをばらして使うか、それともこのまま使うか。現在、SVertexはこのようになっています。

struct SVertex {
	Vector3d position;	// 位置
	Vector3d normal;	// 法線
	Vector2d tex_uv;	// テクスチャの座標
	unsigned int color;	// 色
};

コーディングする際にはこのほうが扱いやすいのですが、gl*Pointer()を使っているため、頂点は頂点、法線は法線で連続していないと高速化*1できず、glInterleavedArrays()を使っているのと同じことになる なんていうのを読んだことがあるんです。あるんです……が、t-potの中の人は


glVertexPointer の3つめの引数は異なる頂点の時のデータの幅です。今回はこの引数は0にしてデータごとに別の配列を用意していますが、これはデータキャッシュの効率が最悪です。本当は、頂点データの構造体を定義して、その構造体の配列としてデータを準備するような構造にしないとパフォーマンス的にダメダメでしょう。

<と書いていました。う〜ん、どの情報が真実なんでしょう? 僕としては連続してデータが入っていたほうがキャッシュにヒットしやすいので、構造体は使わないほうがいいと思うのですが……。確かその辺の話がGame Programming Gems1に載っていたと思うので、火曜日になったら大学で確認してみようと思います。今日はもう眠くて駄目。。。

Game Programming Gems

Game Programming Gems

*1:つまりgl*Pointerを使う利点