我从Vulkan共享了一个Win32句柄,并在OpenGL中创建了一个共享纹理,如下所示:
#ifdef WIN32
texGl.handle = device.getMemoryWin32HandleKHR({ info.memory, vk::ExternalMemoryHandleTypeFlagBits::eOpaqueWin32 });
#else
texGl.handle = device.getMemoryFdKHR({ info.memory, vk::ExternalMemoryHandleTypeFlagBits::eOpaqueFd });
#endif
GLASSERT(texGl.handle);
auto req = device.getImageMemoryRequirements(texGl.texVk.image);
// Create a 'memory object' in OpenGL, and associate it with the memory allocated in Vulkan
glCreateMemoryObjectsEXT(1, &texGl.memoryObject);
#ifdef WIN32
glImportMemoryWin32HandleEXT(texGl.memoryObject, req.size, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT, texGl.handle);
#else
glImportMemoryFdEXT(texGl.memoryObject, req.size, GL_HANDLE_TYPE_OPAQUE_FD_EXT, texGl.handle);
// fd got consumed
//texGl.fd = -1;
#endif
glCreateTextures(GL_TEXTURE_2D, 1, &texGl.oglId);
GLCALL(glTextureStorageMem2DEXT(texGl.oglId, texGl.mipLevels, format, texGl.imgSize.width, texGl.imgSize.height, texGl.memoryObject, info.offset));
那么
我使用copy,例如:
glCopyImageSubData(hsrcTex, GL_TEXTURE_2D, 0, 0, 0, 0, hDesTex,
GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
然后我得到图像数据,比如:
GLsizei size = width * height * pixsize;
GLubyte* data = (GLubyte*)malloc(size);
//(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels)
glGetTextureImage(GLuint(desTexture->getID()), 0, (GLenum)desTexture->getFormat(), desTexture->getType(), size, data);
glGetTextureImage(GLuint(desTexture->getID()), 1, (GLenum)desTexture->getFormat(), desTexture->getType(), size, data);
但是mipMap是任意Nums,则数据为空。
我确信srcTexture有数据可以保存.png文件。我该如何复制呢???
1条答案
按热度按时间dtcbnfnu1#
这是我的一个错误:上面讨论的代码是好的。
GL在使用过程中报告了一个错误。因为GL没有错误检测。
空glTextureStorageMem2DEXT(GLuint纹理、GLsizei级别、GLenum内部格式、GLsizei宽度、GLsizei高度、GLuint内存、GLuint64偏移量)。
https://github.com/nvpro-samples/gl_vk_simple_interop
我错误地按要求使用了Format而不是InternalFormat。当我修复这个小错误时,程序运行正常。
:)