J'ai récemment reçu le MacBook Pro 2016 avec un Radeon 445 gpu et maintenant j'ai des problèmes avec les fonctions du noyau qui fonctionnent bien sur iOS et El Capitan avec Nvidia gpu. Il semble que les textures 3D ne sont pas interpolées dans l'axe Z, même si je spécifie mon sampler comme ceci:Interpolation des textures 3d dans les fonctions du noyau Metal ne fonctionnant pas sur Radeon gpu
constexpr sampler s = sampler(coord::normalized,
address::repeat,
filter::linear);
Le problème est très visible dans cette image:
J'ai essayé de forcer Intel iris graphiques (intégré) en utilisant:
NSArray *devices = MTLCopyAllDevices();
device = devices[1];
Au lieu de
device = MTLCreateSystemDefaultDevice();
Mais cela ne me donne pas un contexte du tout, même si
device = devices[0];
fonctionne très bien.
J'ai essayé de passer à halfs flotte dans les grains, mais sans résultat différent.
MISE À JOUR: Comme suggéré ci-dessous par Ken, créant ainsi l'état d'échantillonnage sur le cpu et en passant comme un uniforme semble faire l'affaire:
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];
En shaders:
sampler s [[sampler(0)]]
Je Je suis toujours très intéressé d'apprendre pourquoi et quand l'échantillonneur constexpr échouerait sur le matériel Radeon en 3 dimensions.
choses à essayer si vous n'avez pas: spécifier 'min_filter',' mag_filter', et (peut-être) 'mip_filter' indépendamment, au lieu de' filter'. Essayez 'bicubic' au lieu de' linear' juste pour voir si c'est important. Essayez de créer un objet 'MTLSamplerState' et transmettez-le via l'API plutôt qu'un échantillonneur défini dans le code shader. –
Créer le MTLSamplerState sur le CPU comme vous le suggère résout le problème. Je vous remercie! Une idée pourquoi, ou c'est un bug connu? –
bicubique n'est pas défini je pense, au moins je ne peux pas y accéder. –