我最近购买了配备 Radeon 445 GPU 的 2016 年末 MacBook Pro,但现在我遇到了内核功能问题,而这些内核功能在 iOS 和 El Capitan 上都运行良好,配备了 Nvidia GPU。似乎 3D 纹理没有在 Z 轴上插值,即使我这样指定我的采样器也是如此:
constexpr sampler s = sampler(coord::normalized,
address::repeat,
filter::linear);
此图像中的问题非常明显:
我尝试使用以下方法强制使用 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/