【发布时间】:2019-05-18 15:28:12
【问题描述】:
我正在为 Motion 和 FCP X 开发一些 FxPlug 插件。最终,我希望它们在 Metal 中渲染,因为 Apple 正在弃用 OpenGL。
我目前正在使用 CoreImage,虽然我已经能够使用 CoreImage 功能在 FxPlug SDK 之外进行金属处理,但 FxPlug 仅将帧作为 OpenGL 纹理提供给我。我尝试将其传递给 CoreImage 过滤器,但最终出现此错误:
Cannot render image (with an input GL texture) using a metal-DG context.
在research 之后,我发现我应该可以使用 CVPixelBuffers 在两者之间共享纹理,但是在尝试使用这种方法编写代码一段时间后,我开始相信这是故意的作为 WRITE(如从头开始创建)到共享缓冲区的一种方式,但不能在两者之间进行转换。虽然这可能不正确,但我找不到让现有 GL 纹理存在于 CVPixelBuffer 中的方法。
TL;DR:我找到了从 CVPixelBuffer 获取结果 Metal 或 OpenGL 纹理的方法,但我找不到从现有 OpenGL 纹理创建 CVPixelBuffer 的方法。我的心不在这个方法上,因为我的最终目标是简单地从 OpenGL 转换为 Metal,然后再转换回 OpenGL(理想情况下以一种有效的方式)。
有没有其他人找到使用 FxPlug 和 Metal 的方法?有没有从 OpenGL 纹理转换为 Metal/CVPixelBuffer 的好方法?
【问题讨论】:
-
您可以创建共享纹理并使用 OpenGL 从 FxPlug 提供的 OpenGL 纹理复制到该共享纹理,使用 Metal 对共享纹理执行任何其他操作,然后使用 OpenGL将其复制回 FxPlug 提供的纹理。
-
我想我的问题是我不知道如何将它复制到共享纹理。你有任何示例代码吗? FxTexture 提供了
(GLuint)textureId;和(GLenum)target;,我发现没有办法利用其中任何一个复制到 CVPixelBuffer。
标签: opengl metal core-image cvpixelbuffer