当前位置: 首页 >  网站大师 >  Vulkan的VkImage和OpenGL的Texture2D互转的3种方法

Vulkan的VkImage和OpenGL的Texture2D互转的3种方法

导读:Vulkan的纹理和OpenGL的纹理之间共享的解决方案,.因为项目的功能需要同时引入OpenGL和Vulkan,又因为效率的影响必须想办法优化,两者之间需要互相访问互相转换的高效方案。.Vulkan的纹理图像类型是:VkImage,OpenGL的纹理类型是:Texture2D.

Vulkan的纹理和OpenGL的纹理之间共享的解决方案,

因为项目的功能需要同时引入OpenGL和Vulkan,又因为效率的影响必须想办法优化,两者之间需要互相访问互相转换的高效方案。

Vulkan的纹理图像类型是:VkImage,OpenGL的纹理类型是:Texture2D

此文原创,收集和编写不易,望能珍惜。

1. NVIDIA GPU Only的方案

在OpenGL 4.5 规范(简介)第 1 章的补充中新增了一个扩展GL_NV_draw_vulkan_image

有提供如下函数

glDrawVkImageNV
glGetVkProcAddrNV
glSignalVkFenceNV
glSignalVkSemaphoreNV
glWaitVkSemaphoreNV

对应Vulkan这边也有NVIDIA CPU Only的方案新增(已在Vulkan1.0之后的版本弃用)

VK_NV_external_memory
VK_NV_external_memory_capabilities

2. Windows Only的方案

OpenGL新增了扩展

GL_EXT_memory_object_win32
---------------------------
  glImportMemoryWin32HandleEXT
  glImportMemoryWin32NameEXT

GL_EXT_memory_object
---------------------
  glBufferStorageMemEXT
  glCreateMemoryObjectsEXT
  glDeleteMemoryObjectsEXT
  glGetMemoryObjectParameterivEXT
  glGetUnsignedBytei_vEXT
  glGetUnsignedBytevEXT
  glIsMemoryObjectEXT
  glMemoryObjectParameterivEXT
  glNamedBufferStorageMemEXT
  glTexStorageMem1DEXT
  glTexStorageMem2DEXT
  glTexStorageMem2DMultisampleEXT
  glTexStorageMem3DEXT
  glTexStorageMem3DMultisampleEXT
  glTextureStorageMem1DEXT
  glTextureStorageMem2DEXT
  glTextureStorageMem2DMultisampleEXT
  glTextureStorageMem3DEXT
  glTextureStorageMem3DMultisampleEXT

对应Vulkan也有与之对应的函数:

#ifdef VK_KHR_external_memory_win32
//获取内存对象的 Windows句柄
VkResult vkGetMemoryWin32HandleKHR(
    VkDevice                                    device,
    const VkMemoryGetWin32HandleInfoKHR*        pGetWin32HandleInfo,
    HANDLE*                                     pHandle);

//获取外部内存Win32句柄的属性
//与Vulkan兼容的Windows内存句柄也可以由使用超出本规范范围的方法的非Vulkan API,如OpenGL。
VkResult vkGetMemoryWin32HandlePropertiesKHR(
    VkDevice                                    device,
    VkExternalMemoryHandleTypeFlagBits          handleType,
    HANDLE                                      handle,
    VkMemoryWin32HandlePropertiesKHR*           pMemoryWin32HandleProperties);
#endif

3. 其他操作系统的方案

OpenGL的扩展函数:

GL_EXT_memory_object_fd
------------------------
  glImportMemoryFdEXT

GL_EXT_memory_object
---------------------
  glBufferStorageMemEXT
  glCreateMemoryObjectsEXT
  glDeleteMemoryObjectsEXT
  glGetMemoryObjectParameterivEXT
  glGetUnsignedBytei_vEXT
  glGetUnsignedBytevEXT
  glIsMemoryObjectEXT
  glMemoryObjectParameterivEXT
  glNamedBufferStorageMemEXT
  glTexStorageMem1DEXT
  glTexStorageMem2DEXT
  glTexStorageMem2DMultisampleEXT
  glTexStorageMem3DEXT
  glTexStorageMem3DMultisampleEXT
  glTextureStorageMem1DEXT
  glTextureStorageMem2DEXT
  glTextureStorageMem2DMultisampleEXT
  glTextureStorageMem3DEXT
  glTextureStorageMem3DMultisampleEXT

Vulkan的与之对应的扩展函数:

#ifdef VK_KHR_external_memory

#endif

#ifdef VK_KHR_external_memory_capabilities
//需要支持Vulkan 1.0,需要启用VK_KHR_get_physical_device_properties2

void vkGetPhysicalDeviceExternalBufferProperties(
    VkPhysicalDevice                            physicalDevice,
    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,
    VkExternalBufferProperties*                 pExternalBufferProperties);

typedef struct VkExternalMemoryProperties {
    //externalMemoryFeatures是 VkExternalMemoryFeatureFlagBits 的位掩码,指定的功能。
    VkExternalMemoryFeatureFlags       externalMemoryFeatures;
    //exportFromImportedHandleTypes是 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定哪些类型的可以从中导出导入的手柄。
    VkExternalMemoryHandleTypeFlags    exportFromImportedHandleTypes;
    //compatibleHandleTypes是 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定可以在创建与外部存储器兼容的图像。
    VkExternalMemoryHandleTypeFlags    compatibleHandleTypes;
} VkExternalMemoryProperties;

#endif
内容
  • 1.4 编写简易ShellCode弹窗
    1.4 编写简易ShellCod
    2023-12-02
    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关
  • games101-1 光栅化与光线追踪中的空间变换
    games101-1 光栅化与光
    2023-12-05
    在学习了一些games101的课程之后,我还是有点困惑,尤其是对于课程讨论的空间的变换,幸而最*在做games101的第
  • 一种简化操作日志记录方案
    一种简化操作日志记录方案
    2023-12-06
    一、背景:.后台系统配置越来越多的出现需要进行日志记录的功能,且当前已有日志记录不可复用,需要统一日志记录格式,提高日志
  • 【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。
    

SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化
    【短道速滑十】非局部均值滤波的指
    2023-12-04
    非局部均值滤波(Non Local.Means)作为三大最常提起来的去燥和滤波算法之一(双边滤波、非局部均值、BM3D)
  • 工业镜头篇之镜头光圈
    工业镜头篇之镜头光圈
    2023-12-03
    目录.光圈的定义.光圈的位置.光圈系数F.参考资料.光圈的定义.光圈位于镜头内部,通过收缩与扩大控制入射光强度 (常规镜
  • SSH教程0简介
    SSH教程0简介
    2023-12-06
    0 简介.OpenSSH (http://www.OpenSSH.com).已成为远程管理UNIX类系统和许多网络设备的