PBO を使用して CPU と GPU の間でデータを転送する GPGPU アプリケーションに取り組んでいます。私のアプリケーションの要件の 1 つは、OpenGL レンダリング スレッドのブロックをできるだけ少なくし、処理のレイテンシをできるだけ低くすることです。
私の質問は、glTexSubImage2D への呼び出し (ホストからデバイスへの変換を開始する) と実際にテクスチャを使用/レンダリングする間にレイテンシを追加する必要があるかどうかです。たとえば、サイズが 1024x1024 のテクスチャの場合、そのようなレイテンシはどれくらいの大きさでなければなりませんか?
for(auto texture: textures)
{
glBindTexture(GL_TEXTURE_2D, texture.id());
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, ...);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, ..., NULL, GL_STREAM_DRAW);
void* mem = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
copy(mem, data);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);
glTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, ..., NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
do_other_cpu_stuff_while_data_is_transferring(); // Is this needed to avoid blocking calls while rendering? If so, what strategy can I use to estimate the minimum amount of time needed to transfer the data.
for(auto texture: textures)
{
render(texture);
}