2016-11-24 1 views
1

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: screenshot where Z goes from left to right

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.

+0

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. –

+0

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? –

+0

bicubique n'est pas défini je pense, au moins je ne peux pas y accéder. –

Répondre

1

Apparemment, la création d'un objet MTLSamplerState et sa transmission par l'intermédiaire de l'API plutôt que d'un échantillonneur défini dans le shader contourne le problème.

+0

Je peux confirmer, mais je ne peux pas l'interpolation pour travailler sur les textures RG8Uint, même avec le passage vers le bas l'objet d'état de l'échantillonneur. Solution de contournement utilise RG16float pour l'instant. –