Vulkan的VkImage和OpenGL的Texture2D互转的3种方法
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种方法的更多相关文章
- 在 Linux 下将 PNG 和 JPG 批量互转的四种方法
计算机术语中,批处理指的是用一个非交互式的程序来执行一序列的任务[1]的方法.这篇教程里,我们会使用 Linux 命令行工具,并提供 4 种简单的处理方式来把一些 .PNG 格式的图像批量转换成 .J ...
- String与InputStream互转的几种方法
[java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...
- java实现map和object互转的三种方法
/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObje ...
- JavaScript 字符串与json对象互转的几种方法
第一种:浏览器支持的转换方式(Firefox,chrome,opera,safari,ie)等浏览器: JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON. ...
- JavaScript中unicode编码与String互转(三种方法)
1.引言 JS本身就支持unicode转string功能,一共有三种方式和String单个字符转unicode编码. 2.方法 //unicode转String 1. eval("'&quo ...
- SQL SERVER 将表字段值0和1互转的几种方法
需求: 如果表字段的值为 0 则将其修改为1 ,如果表字段的值为 1 则将其修改为 0. 方法一 end 方法二 ) 方法三 )
- json、javaBean、xml互转的几种工具介绍
json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...
- OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)
实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...
- json、javaBean、xml互转的几种工具介绍 (转载)
工作中经常要用到Json.JavaBean.Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考. 现在主流的转换工具有json-lib.jackson.fastjson等,我为大家一一做简 ...
- OpenGL纹理上下颠倒翻转的三种解决办法
http://blog.csdn.net/narutojzm1/article/details/51940817 综述 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题.原因是因为O ...
随机推荐
- 力扣1132(MySQL)-报告的记录Ⅱ(中等)
题目: 编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位. Actions 表: Removals 表: Result 表: 2019-07 ...
- 力扣609(java&python)-在系统中查找重复文件(中等)
给你一个目录信息列表 paths ,包括目录路径,以及该目录中的所有文件及其内容,请你按路径返回文件系统中的所有重复文件.答案可按 任意顺序 返回. 一组重复的文件至少包括 两个 具有完全相同内容的文 ...
- 力扣532(java&python)-数组中的 k-diff 数对(中等)
题目: 给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目. k-diff 数对定义为一个整数对 (nums[i], n ...
- 注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级
简介: MSE 云原生网关作为托管型的独享实例,与部署业务应用的资源解耦,并支持过载保护.故障自愈.限流降级等功能,确保流量高峰时的稳定性.其优异的性能表现使费芮不需要高规格的资源配置即可支撑大规模的 ...
- 37 手游基于 Flink CDC + Hudi 湖仓一体方案实践
简介: 介绍了 37 手游为何选择 Flink 作为计算引擎,并如何基于 Flink CDC + Hudi 构建新的湖仓一体方案. 本文作者是 37 手游大数据开发徐润柏,介绍了 37 手游为何选择 ...
- [FAQ] 夏玉米 按规则查询域名靠谱吗 ?
很早就有一个网站叫 夏玉米,可以按规则查询和注册域名,那么它真如我们想的那样 可以找到好域名吗? 虽然看起来很好用,实际上夏玉米的查询只是针对它自己的数据库,不包含未在其平台注册的域名,所以大家要失望 ...
- Java equals(),== 和 hashcode()
首先来看看equals() 和 "==" 的关系 1.在Java中==是用来比较两个对象的内存地址是否相同的,如果是基本类型的话将会比较其值. 2.equals()我们如果使用的是 ...
- C++多态与虚拟:运算符重载(Operator Overloading)
运算符重载:与function overloading异曲同工的是,C++提供所谓的Operator overloading.所谓operators是像 +(加)-(減)*(乘)/(除)>&g ...
- 习题8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim
2. 设计一个"1001"串行数据检测器,其输入.输出如下: 输入x:000 101 010 010 011 101 001 110 101 输出z:000 000 000 010 ...
- foreach更改element内容后this到data不生效导致页面数据无变化
list.forEach(element => { element = element.split('^') console.log(element) }) 数据已经被更改,但在外部t ...