2

OpenGL 3レンダリングポイント:ポイントはスペースパーティションツリー内に保存されます。ツリーには、色と通常の情報属性を持つポイントがあります。

ポイント情報とその属性は、バッファのセットとして保存されます。

  1. オフセットバッファはベクトル配列です。

  2. ポイントは、センターおよびオフセットインデックスとしてメモリに保存されます。オフセットインデックスは、オフセットバッファを指しPoint = center + OffSetBuffer[offset index]ます。

  3. 法線は法線バッファに格納され、各ポイントは法線バッファのインデックスを保持します。

  4. 色はカラーバッファに保存され、各ポイントはカラーバッファのインデックスを保持します。

バッファのレイアウトを変更する余地はありますが、上記のように情報を保持することで、反復的な情報や冗長な情報を減らすことができます。

私の質問は、OpenGL 3+ APIを使用して上記のポイントを効率的にレンダリングするにはどうすればよいですか?

4

1 に答える 1

1

追加のオフセットバッファとオフセットインデックスは必要ありません。テクスチャ座標を渡すだけです。頂点プログラムで行うべきことは次のとおりです。

1)ModelViewマトリックスからパーティクルベースを計算します。

vec3 X = vec3(ModelView[0][0], ModelView[1][0], ModelView[2][0]);
vec3 Y = vec3(ModelView[0][1], ModelView[1][1], ModelView[2][1]);

2)粒子サイズに基づいてコーナーポイントを計算します(均一または属性にすることができます):

   vec3 A1 = -X*SizeX - Y*SizeY;
   vec3 B1 =  X*SizeX - Y*SizeY;
   vec3 C1 =  X*SizeX + Y*SizeY;
   vec3 D1 = -X*SizeX + Y*SizeY;

3)中心点を適切なコーナーに移動します。

   if (TexCoord == vec2(0.0, 0.0)) Position += A1;
   if (TexCoord == vec2(1.0, 0.0)) Position += B1;
   if (TexCoord == vec2(1.0, 1.0)) Position += C1;
   if (TexCoord == vec2(0.0, 1.0)) Position += D1;

またはより効率的なブランチレスコード:

vec3 O1 = ( 1.0 - TexCoord.y ) * ( A1 * ( 1.0 - TexCoord.x ) + B1 * TexCoord.x );
vec3 O2 = TexCoord.y * ( C1 * TexCoord.x + D1 * (1.0 - TexCoord.x ) );
Position += O1 + O2;
于 2012-09-19T10:19:10.610 に答える