ios - Metal 内核函数中的 3d 纹理插值不适用于 Radeon gpu

标签 ios macos metal

我最近购买了配备 Radeon 445 GPU 的 2016 年末 MacBook Pro,但现在我遇到了内核功能问题,而这些内核功能在 iOS 和 El Capitan 上都运行良好,配备了 Nvidia GPU。似乎 3D 纹理没有在 Z 轴上插值,即使我这样指定我的采样器也是如此:

constexpr sampler s = sampler(coord::normalized,
                              address::repeat,
                              filter::linear);

此图像中的问题非常明显: screenshot where Z goes from left to right

我尝试使用以下方法强制使用 Intel Iris 图形(集成):

NSArray *devices = MTLCopyAllDevices();
device = devices[1];

代替

device = MTLCreateSystemDefaultDevice();

但这根本没有给我一个上下文,即使

device = devices[0];

工作得很好。

我试过在内核中从半轴切换到 float ,但没有任何不同的结果。

更新:正如 Ken 在下面所建议的那样,在 cpu 上创建采样器状态并将其作为制服传递似乎可以解决问题:

MTLSamplerDescriptor *samplerDescriptor = [MTLSamplerDescriptor new];
samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear;
samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear;
samplerDescriptor.sAddressMode = MTLSamplerAddressModeRepeat;
samplerDescriptor.tAddressMode = MTLSamplerAddressModeRepeat;
samplerDescriptor.rAddressMode = MTLSamplerAddressModeRepeat;
id<MTLSamplerState> sampler = [device newSamplerStateWithDescriptor:samplerDescriptor];
[commandEncoder setSamplerState:sampler atIndex:0];

在着色器中:

sampler s [[sampler(0)]]

我仍然很想知道 constexpr 采样器在 3 维 Radeon 硬件上失败的原因和时间。

最佳答案

显然,创建一个 MTLSamplerState 对象并通过 API 将其向下传递而不是在着色器代码中定义的采样器可以解决这个问题。

关于ios - Metal 内核函数中的 3d 纹理插值不适用于 Radeon gpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40794621/

相关文章:

mysql - 无法在 MySql Server Mac OS 上重置 root 密码

macos - 如何将 NSView 的内容保存到比实际更大的文件中

objective-c - 在 Swift 中从 vDSP DSPSplitComplex 创建 Metal 缓冲区

swift - Metal 渲染奇怪的较暗纹理,即使使用 [MTKTextureLoader.Option.SRGB : false]?

ios - 更漂亮的 if 语句行为方式

ios - 为什么 NSLineBreakByWordWrapping 拆分单词?

ios - 如何移动文本框?

ios - Interface Builder 中的未知类,从 xcode9 beta5 迁移到 xcode 8.3

macos - 无法在 OS X (El Capitan) 上安装 perl 模块 Glib

swift - 如何使用 UnsafeMutableRawPointer 填充数组?