Я не понял, как именно OpenGL 4.0 работает с этой функцией, поскольку, как я понял, раньше она существовала и раньше.Я не уверен, что это ответит на ваш вопрос, но я все равно расскажу то, что знаю о предмете.
Это относится к ситуации, когда какая-то другая библиотека, кроме OpenGL, такая как OpenCL или CUDA, производит какую-тоданные непосредственно в память графической карты, а затем OpenGL продолжается от того места, где осталась другая библиотека, и использует эти данные как
- пиксельный буферный объект (PBO), когда они хотят нарисовать данные вэкран как текстуру
- , когда они хотят использовать графические данные как часть некоторой другой сцены
- объект буфера вершин (VBO), когда они хотят использовать полученные данные как некоторый произвольный атрибутвход для вершинного шейдера.(одним из примеров этого может быть система частиц, которая моделируется с помощью CUDA и визуализируется с помощью OpenGL)
В подобной ситуации очень хорошая идея - сохранить данные на видеокарте всевремя, а не копировать его, особенно не копировать его через ЦП, потому что шина PCIe очень медленная по сравнению с шиной памяти графической карты.
Вот пример кода, который поможет с CUDA и OpenGLдля VBO и PBO:
// 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, но идея та же.Различаются только имена функций.
Еще один способ сделать то же самое - это то, что называется закрепленная в хосте память .При таком подходе вы сопоставляете некоторый диапазон адресов памяти ЦП с памятью графической карты.