金属内核函数中的3d纹理插值不适用于Radeon gpu

时间:2016-11-24 21:18:42

标签: ios macos metal

我最近使用Radeon 445 gpu获得了2016年末的MacBook Pro,现在我在使用Nvidia gpu的iOS和El Capitan上运行良好的内核功能时遇到了麻烦。看起来3D纹理没有在Z轴上插值,即使我像这样指定我的采样器:

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

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

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

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

而不是

device = MTLCreateSystemDefaultDevice();

但即使

,这根本不能给我一个背景信息
device = devices[0];

工作正常。

我尝试在内核中从halfs切换到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采样器会在Radeon硬件上以三维方式失败。

1 个答案:

答案 0 :(得分:1)

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