0

私が書いたOpenGLアプリは、適切な形式の大きなデータファイルのビューアとして機能します。

これは非常に単純で、各データセットを一度に1つずつループし、glCallListを使用して各データセットを描画します。

for (all objects in our in our data set)
{
    if (first time drawing this object)
    {
        glNewList(...);
        for (all pixels in object_memory)
        {
          drawpixel(); 
        }
        glEndList();
        glCallList(...);
        delete object_memory
    }
    else 
    {
        glCallList(...);
    }
}

個々のglCallListの透明度を変更できる機能を追加しようとしています。問題は、データファイルが非常に大きいため、glCallListを生成してから、読み取った実際のデータを削除する必要があることです。これにより、メモリ使用量が4GBから約400MBに減少します。glCallListsの使用は、アプリケーションの速度にとっても非常に重要です。glCallListsがないと、クロールが遅くなります。

実際にリストを呼び出す前に、現在のマトリックスのグローバル透明度を変更する方法はありますか?

アルファ値を更新する必要があるたびにリストを更新することはオプションではありません。

あるいは、CallListsと同じパフォーマンス上の利点があるが、簡単に更新できる別の方法はありますか?

以前にVBO(Vertex Buffer Objects)について読んだことがありますが、それらは似ているように聞こえますが、データがアプリケーションドメインに正しく適合しているかどうかはわかりません。

どんな考えや意見も本当に適用されます。

ありがとう、

〜ブライアン

4

1 に答える 1

2

アルファを変更するために私が考えることができる最も簡単な普遍的な方法は、頂点またはフラグメントシェーダーに渡されるユニフォームを使用することです。

VBOは役立つかもしれませんが、実際に何をしているかについての詳細情報がないとわかりません...カードへの帯域幅がフレームで処理できるよりも多くの頂点がある場合のVBOの助け-したがって、メッシュが非常に複雑な場合(たとえば、高解像度の地形)それらはあなたが探しているものかもしれません。

(コメントへの返信)DrawPixelルーチンが即時モードで実装されているように聞こえますが、これは実際には非効率的です。glBegin()... glEnd()の代わりに頂点配列を使用してみてください-描画リストから得たのと同じパフォーマンスの改善がたくさん見られると思います。

于 2009-05-31T03:02:58.087 に答える