【发布时间】:2019-12-16 00:32:36
【问题描述】:
我有一个非常奇怪的问题,我在任何地方都没有提到。我的公司为各种主机开发插件。现在我们正在尝试将我们的 OpenGL 代码移动到 Metal。我尝试了一些主机(如 Logic 和 Cubase),并且成功了。示例如下:
但是,最近,这些应用程序的新版本可用,使用 10.14 MacOS SDK 编译,这是我开始得到的:
所以,我们有两个问题:颜色和翻转纹理。我找到了颜色的解决方案(见下面的代码),但我完全不知道如何解决纹理问题!当然,我可以翻转纹理,但是在以前的应用程序版本中,它们会损坏。
我相信 PNG 加载发生了一些变化,因为如果您仔细观察 - 动态生成的文本纹理,在两种情况下看起来都一样。
这是我的代码:
imageOptions = @{MTKTextureLoaderOptionSRGB : @FALSE}; // Solves the color problem
NSData* imageData = [NSData dataWithBytes:imageBuffer length:imageBufferSize];
requestedMTLTexture = [m_metal_renderer.metalTextureLoader newTextureWithData:imageData options:imageOptions error:&error];
而 imageData 是放置 PNG 的内存。我也尝试过这种方法:
CGDataProvider* imageData = CGDataProviderCreateWithData(nullptr, imageBuffer, imageBufferSize, nullptr);
CGImage* loadedImage = CGImageCreateWithPNGDataProvider(imageData, nullptr, false, kCGRenderingIntentDefault);
requestedMTLTexture = [m_metal_renderer.metalTextureLoader newTextureWithCGImage:loadedImage options:0 error:&error];
得到完全相同的结果。
在 10.14 操作系统上使用最新的 10.14 SDK 构建的所有应用程序都会出现此问题。有没有人知道是什么原因造成的,或者至少给我一种方法来理解我编译的 SDK 是什么?
【问题讨论】:
-
你的纹理被翻转了,你需要按图像的高度进行平移并翻转Y轴的符号。此外,您需要将纹理读取为 BGRA,以避免出现 B 和 R 通道向后的问题。不要使用金属纹理加载器,直接使用 CoreGraphics API。
标签: macos png metal macos-mojave metalkit