opengl shareTexture复制为null
我从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));
然后
使用副本,例如:
glCopyImageSubData(hsrcTex, GL_TEXTURE_2D, 0, 0, 0, 0, hDesTex,
GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
然后我getimageData,喜欢:
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,数据为null。
我敢肯定,srctexture是有数据来保存“ .png”的数据。 我该如何执行副本???
I had a Win32 handle shared from Vulkan and created a shared texture in OpenGL ,like:
#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));
then
I use copy,like:
glCopyImageSubData(hsrcTex, GL_TEXTURE_2D, 0, 0, 0, 0, hDesTex,
GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
then I getImageData,like:
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);
but the mipMap is any Nums,data is NULL.
I'm sure the srcTexture is have data to save the ".png".
How can I perform copy???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这对我来说是一个错误:上面有关的代码很好。
GL在使用过程中报告了错误。
因为GL没有错误检测。
void gltexturestoragememem2dext(Gluint纹理,Glsizei级别,Glenum Internalforat,Glsizei宽度,Glsizei高度,Gluint Memory,Gluint64偏移)。
https://github.com/nvpro-samples/gl_vk_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_simple_interop
我误用了internally formate formate internally formatly internally internally internall formate根据需要。当我修复了这个小错误时,该程序工作正常。
:)
This is a mistake on my part: the code in question above is fine.
Gl reported an error during use.
Because there is no error detection with GL.
The void glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset).
https://github.com/nvpro-samples/gl_vk_simple_interop
I mistakenly used Format instead of internalFormat as required. When I fixed this small error, the program worked fine.
:)