私が理解している限り、OpenGL 4.0は以前から存在していたため、この機能がどのように機能するのか特にわかりません。これがあなたの質問に答えるかどうかはわかりませんが、とにかくその主題について私が知っていることを教えます。
これは、OpenCLやCUDAなどのOpenGL以外のライブラリがグラフィックカードのメモリに直接データを生成し、OpenGLが他のライブラリが残った場所から続行し、そのデータを次のように使用する状況を指します。
- データをそのまま画面に描画したい場合のピクセルバッファオブジェクト(PBO)
- グラフィックデータを他のシーンの一部として使用したい場合のテクスチャ
- 生成されたデータを頂点シェーダーの任意の属性入力として使用する場合の頂点バッファーオブジェクト(VBO)。(この一例は、CUDAでシミュレートされ、OpenGLでレンダリングされるパーティクルシステムです)
このような状況では、データを常にグラフィックカードに保持し、コピーしないことをお勧めします。特に、CPUを介してデータをコピーしないでください。これは、PCIeバスがグラフィックスカード。
VBOおよびPBO用のCUDAおよびOpenGLでトリックを実行するためのサンプルコードを次に示します。
// in the beginning
glGenBuffers(&id, 1);
// for every frame
cudaGLRegisterBufferObject(id);
CUdeviceptr ptr;
cudaGLMapBufferObject(&ptr, id);
// <launch kernel here>
cudaGLUnmapBufferObject(id);
// <now use the buffer "id" with OpenGL>
cudaGLUnregisterBufferObject(id);
そして、データをテクスチャにロードする方法は次のとおりです。
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, id);
glBindTexture(GL_TEXTURE_2D, your_tex_id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, 0);
また、GL_RGBAの代わりにもっと変わった形式を使用すると、すべての値を変換する必要があるため、処理が遅くなる可能性があることにも注意してください。
OpenCLはわかりませんが、考え方は同じです。関数名のみが異なります。
同じことを行う別の方法は、いわゆるホスト固定メモリです。このアプローチでは、CPUメモリアドレス範囲の一部をグラフィックカードメモリにマップします。