ユーザーがズームしてスムーズにパンできる時系列ビューアを実装したいと思います。
以前にいくつかの即時モードopenglを実行しましたが、VBOを優先して非推奨になりました。私が見つけることができるVBOのすべての例は、すべてのポイントのXYZ座標を格納します。
パン中に「スムーズ」と呼ばれるフレームレートを取得するには、すべてのデータをVRAMに保持する必要があると思いますが、Yデータ(従属変数)しかありません。Xはインデックスから計算できる独立変数であり、Zは定数です。XとZを保存する必要がある場合、メモリ要件(バッファサイズとCPU-> GPUブロック転送の両方)が3倍になります。また、ユーザーがパンできる数千万のデータポイントがあるため、メモリ使用量は重要です。
インデックスが他の座標として使用される1-D頂点配列を描画するか、1-D配列を(おそらくテクスチャに)格納し、シェーダープログラムを使用してXYZを生成するためのテクニックはありますか?スケーリングと変換を実装するには、新しい固定機能のないパイプラインモデルの下で、とにかく単純なシェーダーが必要であるという印象を受けています。したがって、X座標とZ座標の生成と、Yのスケーリング/変換を組み合わせることができれば、理想。
これも可能ですか?これを行うサンプルコードを知っていますか?または、少なくとも、どのGL関数をどの順序で呼び出すかを示す擬似コードを教えていただけますか?
ありがとう!
編集:これを明確にするために、同等のイミディエートモードコードと頂点配列コードを次に示します。
// immediate
glBegin(GL_LINE_STRIP);
for( int i = 0; i < N; ++i )
glVertex2(i, y[i]);
glEnd();
// vertex array
struct { float x, y; } v[N];
for( int i = 0; i < N; ++i ) {
v[i].x = i;
v[i].y = y[i];
}
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_LINE_STRIP, 0, N);
v[]
の2倍のサイズであることに注意してくださいy[]
。