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 ...
随机推荐
- 基于 OPLG 从 0 到 1 构建统一可观测平台实践
简介: 随着软件复杂度的不断提升,单体应用架构逐步向分布式和微服务的架构演进,整体的调用环境也越来越复杂,仅靠日志和指标渐渐难以快速定位复杂环境下的问题.对于全栈可观测的诉求也变得愈加强烈,Trace ...
- 链路分析 K.O “五大经典问题”
简介:链路分析是基于已存储的全量链路明细数据,自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求. 作者:涯海 链路追踪的 "第三种玩法" 提起链路追踪,大 ...
- Python静态类型解析工具简介和实践
简介: Python是一门强类型的动态类型语言,开发者可以给对象动态指定类型,但类型不匹配的操作是不被允许的.动态类型帮助开发者写代码轻松愉快,然而,俗话说:动态一时爽,重构火葬场.动态类型也带来了许 ...
- [Go] 浅谈 Golang Chan 通信与死锁:all goroutines are asleep - deadlock
Channel创建方式: var c1 chan [value type] c1 = make([channel type] [value type], [capacity]) [value type ...
- [Blockchain] 以太坊主流测试网 ropsten 和 kovan 的区别 以及 如何选择
ropsten 采用 POW (Proof-of-Work)共识机制,挖矿难度系数非常低,容易被攻击,不够低碳环保. kovan 采用 POA (Proof-of-Authority)共识机制,不需要 ...
- WPF 通过 RawInput 获取触摸消息
触摸在 Windows 下属于比较特殊的输入,不同于键盘和鼠标,键盘和鼠标可以通过全局 Hook 的方式获取到鼠标和键盘的输入消息.而触摸则没有直接的 Hook 的方法.如果期望自己的应用,可以在没有 ...
- WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况
本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件将获取不到 Hwnd ...
- 机器学习策略:详解什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)
什么时候该改变开发/测试集和指标? 有时候在项目进行途中,可能意识到,目标的位置放错了.这种情况下,应该移动的目标. 来看一个例子,假设在构建一个猫分类器,试图找到很多猫的照片,向的爱猫人士用户展示, ...
- SpringBoot-EasyExcel导出数据(带图片)
前言 EasyExcel 是阿里巴巴开源的一个Java操作Excel的技术,和EasyPoi一样是封装Poi的工具类. 但是不同的地方在于,在EasyExcel中解决了Poi技术读取大批量数据耗费内存 ...
- Linux 开启防火墙端口策略
1. 安装防火墙 yum install firewalld systemd -y 2. 手动开放防火墙端口 查看防火墙全部设置 firewall-cmd --list-all 若防火墙服务未启动可执 ...