opengl shareTexture复制为null

发布于 2025-02-10 04:51:22 字数 1899 浏览 1 评论 0原文

我从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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌上芳菲 2025-02-17 04:51:22

这对我来说是一个错误:上面有关的代码很好。

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.

:)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文