1

C++ で小さなレイトレーサーをプログラムし
ました。レイトレーシングされた画像をウィンドウに表示したいと考えています。

pixel buffer objectinを使用してから、バッファーをメモリにマップし、ピクセルを 1 つずつ操作してみopenglまし

が、フルスクリーン解像度 1920x1080 では、4 fps
レイトレーシング使用せず、ピクセルの色を変更せず
に、マッピングとマッピング解除のみを行います。

だから私は基本的に、レイトレースされた画像をウィンドウに表示する最速の方法を探しています。

私は現在このようにしています:

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4, 0, GL_STREAM_DRAW_ARB);
if (pixels = (uint*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB))
{
    //modify pixels
    glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
}
else
    return;


//copy from pbo to texture
glBindTexture(GL_TEXTURE_2D, pbo_texture);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);

glEnable(GL_TEXTURE_2D);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//draw image
glColor4f(1.0, 1.0, 1.0, 1.0);
glBindTexture(GL_TEXTURE_2D, pbo_texture);
glBegin(GL_QUADS);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, -1.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0, 0.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0, 0.0);
glEnd();

glutSwapBuffers();

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glBindTexture(GL_TEXTURE_2D, 0);
4

1 に答える 1

6

ループを使用する場合は、メモリ トラバーサルを確認してください。バッファを正しい順序でトラバースする必要があります。そうしないと、反復ごとにキャッシュ ミスが発生する可能性があります。ネストされたループを使用する場合は、x/y 反復順序を切り替えるだけで済みます。

また、グラフィック メモリからデータを読み取らないでください。遅い傾向にあります。PBO にのみ書き込みます。

シンクロの問題のようです。すべてのフレームで pbo をマップする必要があるかどうかはわかりません。OpenGL Pixel Buffer Object (PBO)のこのリンクを確認してください。物事を改善できる失速の回避策もあります

于 2013-09-07T12:49:31.257 に答える