3

非常に大きなポイント クラウド (700 mln ポイント) を視覚化しようとしていますが、glDrawArraysオンコール デバッガーがアクセス違反の書き込み場所の例外をスローします。同じコードを使用して小さな雲 (100 mln) をレンダリングしていますが、すべて正常に動作します。また、データを保存するのに十分な RAM メモリ (32GB) があります。

std::vector<Point3D<float>>Point3D がある場所に使用している点群を保存するには

template <class T>
union Point3D
{
    T data[3];
        struct{
            T x;
            T y;
            T z;
        };
}

頂点配列とバッファの初期化:

glBindVertexArray(pxCloudHeader.uiVBA);

glBindBuffer(GL_ARRAY_BUFFER, pxCloudHeader.xVBOs.uiVBO_XYZ);
glBufferData(GL_ARRAY_BUFFER, pxCloudHeader.iPointsCount * sizeof(GLfloat) * 3, &p3DfXYZ->data[0], GL_STREAM_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);

glBindVertexArray(0);

抽選会:

glBindVertexArray(pxCloudHeader.uiVBA);
glDrawArrays(GL_POINTS, 0, pxCloudHeader.iPointsCount); // here exception is thrown
glBindVertexArray(0);

OpenGL エラーがスローされたかどうかも確認しましたが、何も見つかりませんでした。

4

2 に答える 2

0

小さなバッチでデータを描画できます。バッファーのサイズに事前に定義された上限はありませんが、1 つのバッファーに 8 GB のデータを格納するのはかなりの量です。何かが爆発してもあまり驚かない。

おそらく、各バッファーに 100 万ポイント、多くても数百万ポイントを格納することから始めます。次に、すべてのデータ ポイントを収容するのに十分な、この固定サイズのバッファーのプールを使用します。

これは、すべてのデータをバッファーにコピーする前に描画呼び出しの送信を開始できるため、パフォーマンスにとっても有益です。これにより、CPU と GPU の作業のオーバーラップが改善されます。

シャッフルしているデータの量を考えると、代わりにglMapBuffer()/を使用することを検討することもできます。これにより、通常、データの 1 回のコピー操作を回避できます。glUnmapBuffer()glBufferData()

于 2014-12-21T00:54:22.030 に答える