5

ユーザーがズームしてスムーズにパンできる時系列ビューアを実装したいと思います。

以前にいくつかの即時モード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[]

4

2 に答える 2

4

これはOpenGLにとってはまったく問題ありません。

頂点バッファオブジェクト(VBO)は、必要な情報をGLでサポートされている形式のいずれかで格納できます。VBOを単一の座標で埋めることができます。

glGenBuffers( 1, &buf_id);
glBindBuffer( GL_ARRAY_BUFFER, buf_id );
glBufferData( GL_ARRAY_BUFFER, N*sizeof(float), data_ptr, GL_STATIC_DRAW );

次に、描画に適切な頂点属性形式をバインドします。

glBindBuffer( GL_ARRAY_BUFFER, buf_id );
glEnableVertexAttribArray(0);  // hard-coded here for the sake of example
glVertexAttribPointer(0, 1, GL_FLOAT, false, 0, NULL);

これを使用するには、単純なシェーダープログラムが必要です。頂点シェーダーは次のようになります。

#version 130
in float at_coord_Y;

void main() {
    float coord_X = float(gl_VertexID);
    gl_Position = vec4(coord_X,at_coord_Y,0.0,1.0);
}

シェーダープログラムをリンクする前に、at_coord_Yを使用する属性インデックス(私のコードでは= 0)にバインドする必要があります。

glBindAttribLocation(program_id,0,"at_coord_Y");

または、この属性が自動的に割り当てられたインデックスをリンクした後でプログラムに問い合わせて、それを使用することもできます。

const int attrib_pos = glGetAttribLocation(program_id,"at_coord_Y");

幸運を!

于 2011-02-09T21:05:30.490 に答える
0

何千万ものXY座標をVRAMに保存しますか?

CPUでこれらの座標を計算し、それらをユニフォームとしてシェーダーパイプラインに渡すことをお勧めします(座標はパンされた画像に固定されているため)。

単純にする。

于 2011-02-09T20:24:34.383 に答える