要复制的OpenGL共享纹理为空

t3psigkw  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(191)

我从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文件。我该如何复制呢???

dtcbnfnu

dtcbnfnu1#

这是我的一个错误:上面讨论的代码是好的。
GL在使用过程中报告了一个错误。因为GL没有错误检测。
空glTextureStorageMem2DEXT(GLuint纹理、GLsizei级别、GLenum内部格式、GLsizei宽度、GLsizei高度、GLuint内存、GLuint64偏移量)。
https://github.com/nvpro-samples/gl_vk_simple_interop
我错误地按要求使用了Format而不是InternalFormat。当我修复这个小错误时,程序运行正常。
:)

相关问题