我最近使用Radeon 445 gpu获得了2016年末的MacBook Pro,现在我在使用Nvidia gpu的iOS和El Capitan上运行良好的内核功能时遇到了麻烦。看起来3D纹理没有在Z轴上插值,即使我像这样指定我的采样器:
constexpr sampler s = sampler(coord::normalized,
address::repeat,
filter::linear);
此图片中的问题非常明显:
我尝试使用以下方法强制使用英特尔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硬件上以三维方式失败。
答案 0 :(得分:1)
显然,创建一个MTLSamplerState
对象并通过API传递它而不是在着色器代码中定义的采样器可以解决问题。