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

Vulkan的VkImage和OpenGL的Texture2D互转的3种方法的更多相关文章

  1. 在 Linux 下将 PNG 和 JPG 批量互转的四种方法

    计算机术语中,批处理指的是用一个非交互式的程序来执行一序列的任务[1]的方法.这篇教程里,我们会使用 Linux 命令行工具,并提供 4 种简单的处理方式来把一些 .PNG 格式的图像批量转换成 .J ...

  2. String与InputStream互转的几种方法

    [java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...

  3. java实现map和object互转的三种方法

    /**  * 使用org.apache.commons.beanutils进行转换  */  class A {              public static Object mapToObje ...

  4. JavaScript 字符串与json对象互转的几种方法

    第一种:浏览器支持的转换方式(Firefox,chrome,opera,safari,ie)等浏览器: JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON. ...

  5. JavaScript中unicode编码与String互转(三种方法)

    1.引言 JS本身就支持unicode转string功能,一共有三种方式和String单个字符转unicode编码. 2.方法 //unicode转String 1. eval("'&quo ...

  6. SQL SERVER 将表字段值0和1互转的几种方法

    需求: 如果表字段的值为 0 则将其修改为1 ,如果表字段的值为 1 则将其修改为 0. 方法一 end 方法二 ) 方法三 )

  7. json、javaBean、xml互转的几种工具介绍

    json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...

  8. OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)

    实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...

  9. json、javaBean、xml互转的几种工具介绍 (转载)

    工作中经常要用到Json.JavaBean.Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考. 现在主流的转换工具有json-lib.jackson.fastjson等,我为大家一一做简 ...

  10. OpenGL纹理上下颠倒翻转的三种解决办法

    http://blog.csdn.net/narutojzm1/article/details/51940817 综述 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题.原因是因为O ...

随机推荐

  1. 基于 OPLG 从 0 到 1 构建统一可观测平台实践

    简介: 随着软件复杂度的不断提升,单体应用架构逐步向分布式和微服务的架构演进,整体的调用环境也越来越复杂,仅靠日志和指标渐渐难以快速定位复杂环境下的问题.对于全栈可观测的诉求也变得愈加强烈,Trace ...

  2. 链路分析 K.O “五大经典问题”

    ​简介:链路分析是基于已存储的全量链路明细数据,自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求. 作者:涯海 链路追踪的 "第三种玩法" 提起链路追踪,大 ...

  3. Python静态类型解析工具简介和实践

    简介: Python是一门强类型的动态类型语言,开发者可以给对象动态指定类型,但类型不匹配的操作是不被允许的.动态类型帮助开发者写代码轻松愉快,然而,俗话说:动态一时爽,重构火葬场.动态类型也带来了许 ...

  4. [Go] 浅谈 Golang Chan 通信与死锁:all goroutines are asleep - deadlock

    Channel创建方式: var c1 chan [value type] c1 = make([channel type] [value type], [capacity]) [value type ...

  5. [Blockchain] 以太坊主流测试网 ropsten 和 kovan 的区别 以及 如何选择

    ropsten 采用 POW (Proof-of-Work)共识机制,挖矿难度系数非常低,容易被攻击,不够低碳环保. kovan 采用 POA (Proof-of-Authority)共识机制,不需要 ...

  6. WPF 通过 RawInput 获取触摸消息

    触摸在 Windows 下属于比较特殊的输入,不同于键盘和鼠标,键盘和鼠标可以通过全局 Hook 的方式获取到鼠标和键盘的输入消息.而触摸则没有直接的 Hook 的方法.如果期望自己的应用,可以在没有 ...

  7. WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况

    本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件将获取不到 Hwnd ...

  8. 机器学习策略:详解什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)

    什么时候该改变开发/测试集和指标? 有时候在项目进行途中,可能意识到,目标的位置放错了.这种情况下,应该移动的目标. 来看一个例子,假设在构建一个猫分类器,试图找到很多猫的照片,向的爱猫人士用户展示, ...

  9. SpringBoot-EasyExcel导出数据(带图片)

    前言 EasyExcel 是阿里巴巴开源的一个Java操作Excel的技术,和EasyPoi一样是封装Poi的工具类. 但是不同的地方在于,在EasyExcel中解决了Poi技术读取大批量数据耗费内存 ...

  10. Linux 开启防火墙端口策略

    1. 安装防火墙 yum install firewalld systemd -y 2. 手动开放防火墙端口 查看防火墙全部设置 firewall-cmd --list-all 若防火墙服务未启动可执 ...