2016-11-24 60 views
1

我最近买了已故的2016年的MacBook Pro用的Radeon GPU 445,现在我在与运行在iOS和埃尔卡皮坦细内核函数麻烦Nvidia GPU。看来,3D纹理未在Z轴插补,即使我指定我的采样器是这样的:插值3D纹理的不工作的Radeon GPU

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

问题是这样的形象非常明显: screenshot where Z goes from left to right

我试图迫使英特尔虹膜图形(集成),通过使用:

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

代替

device = MTLCreateSystemDefaultDevice(); 

但是,这并没有给我一个背景可言,即使

device = devices[0]; 

的作品就好了。

我已经尝试从halfs切换到浮点内核,但没有任何不同的结果。

UPDATE:由于肯以下建议,建立对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)]] 

我m仍然非常有兴趣了解为什么以及何时constexpr采样器会在Radeon硬件上出现三维失效。

+0

要尝试的东西如果您还没有:独立指定'min_filter','mag_filter'和(可能)'mip_filter',而不是'filter'。试试'bicubic'而不是'linear'来看看它是否重要。尝试创建一个'MTLSamplerState'对象,并通过API传递它,而不是在着色器代码中定义的采样器。 –

+0

像你所建议的那样在CPU上创建MTLSamplerState可以解决问题。谢谢!任何想法为什么,或者这是一个已知的错误? –

+0

bicubic没有定义我认为,至少我不能访问它。 –

回答

1

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

+0

我可以确认,但我无法获得插值以处理RG8Uint纹理,即使传递给采样器状态对象也是如此。目前,解决方法是使用RG16float。 –