CUDA C Programming Guide | Graphics Interoperability【图形交互性】

CUDA C Programming Guide
3.2.12 Graphics Interoperability

OpenGL和Direct3D中的 一些资源可以映射到CUDA的地址空间
CUDA能够读取OpenGL或Direct3D编写的数据,或者使CUDA能够编写数据供OpenGL或Direct3D使用。
在使用OpenGL互操作和Direct3D互操作功能 映射资源 之前,必须 将资源注册到CUDA

  • 这些函数返回一个指向类型为 struct cudaGraphicsResource 的CUDA图形资源的指针。
  • 注册资源是潜在的高开销,因此通常每个资源只调用一次
    使用cudaGraphicsUnRegierResource()注销CUDA图形资源。
    每个打算使用该资源的CUDA上下文都需要单独注册。
  • 一旦将资源注册到CUDA,就可以使用cudaGraphicsMapResources()和cudaGraphicsUnmapResources()将其映射和取消映射的必要次数。
  • 可以调用cudaGraphicsResourceSetMapFlag()来指定使用提示(只写、只读),CUDA驱动程序可以使用这些提示来优化资源管理。
  • 在映射资源时,通过OpenGL、Direct3D或其他CUDA上下文访问资源会产生未定义的结果。OpenGL互操作和Direct3D互操作给出了每个图形API和一些代码示例的具体说明。

OpenGL Interoperability【OpenGL互操作性】

  • 可映射到CUDA地址空间的OpenGL资源有:

  • 【OpenGL buffer、texture和renderbuffer对象】

  • 使用 cudaGraphicsGLRegisterBuffer() 注册缓冲区对象。在CUDA中,它显示为一个设备指针,因此可以通过内核或cudamemcpy() 调用进行读写

  • 【对于纹理】使用 cudaGraphicsGLRegisterImage() 注册texture或renderbuffer对象。

  • 在CUDA中,它显示为 CUDA数组 。内核可以通过将数组绑定到纹理或表面引用来从数组中读取。

  • 如果资源已使用cudaGraphicsRegisterFlagsSurfaceLoadStore标志注册,则还可以通过surface写入函数向其写入。还可以通过cudaMemcpy2D()调用读写数组。

  • cudaGraphicsGLRegisterImage()支持所有纹理格式,包括1、2或4个组件和内部浮动类型(例如GL_RGBA_FLOAT 32)、归一化整数(例如GL_RGBA8、GL_INTENSITY 16)和非规范化整数(例如GL_RGBA8UI)(请注意,由于非规范化整数格式需要OpenGL 3.0,它们只能由着色器编写,而不能用固定的函数管道编写)。

  • 资源共享的OpenGL上下文必须是当前的主机线程,发出任何OpenGL互操作性API调用。

猜你喜欢

转载自blog.csdn.net/qjh5606/article/details/83345200
今日推荐