2 votes

MTKTextureLoader confond les formats PNG RGB et BGR

J'essaie de porter mon code OpenGL sur Metal one. Pour cela, j'ai besoin de dessiner des textures PNG, et j'utilise MTKTextureLoader pour les charger. Voici le code de mon pipeline :

texturePipelineDescriptor.vertexFunction = textureVertexFunc;
texturePipelineDescriptor.fragmentFunction = textureFragmentFunc;
texturePipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm;

texturePipelineDescriptor.colorAttachments[0].blendingEnabled = YES;
texturePipelineDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd;
texturePipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
texturePipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;

Et voici mon code de chargement :

NSData* imageData = [NSData dataWithBytes:imageBuffer length:imageBufferSize];
id<MTLTexture> newMTLTexture = [m_metal_renderer.metalTextureLoader newTextureWithData:imageData options:nil error:&error];

Et voici le résultat. L'image entière devrait être orange, comme les petites parties.

enter image description here

Si je change cette ligne :

texturePipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm;

Sur cette ligne :

texturePipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;

J'obtiendrai les résultats suivants :

enter image description here

Comme vous pouvez le voir, les images ont changé les canaux R et B. Lorsque je charge les textures, dans TOUTES les images

newMTLTexture.pixelFormat = MTLPixelFormatBGRA8Unorm;

qu'ils soient dessinés correctement ou non. Je soupçonnerais qu'il y a un problème avec les fichiers PNG, mais ils semblent tout à fait normaux dans n'importe quel visualiseur PNG.

Des indices sur ce que je peux faire pour résoudre ce problème ? S'agit-il d'un bogue dans MTLTextureLoader ? Existe-t-il un autre moyen de charger une image PNG ?

P.S. Le logiciel est écrit pour MacOS et non iOS.

0voto

Iron-Eagle Points 1497

J'ai trouvé le problème. Il semble que certains des fichiers PNG étaient stockés au format RGB (24 bits), tandis que d'autres étaient stockés au format RGBA (32 bits). Toutes les couleurs sont devenues correctes après avoir converti les images au format 32 bits.

Je m'attendrais à ce que MTKTextureLoader soit capable de gérer cela, mais apparemment ce n'est pas le cas. Si quelqu'un connaît l'option que j'ai manquée ou un autre moyen de charger correctement ces PNG dans Metal (autre que l'ajout manuel du quatrième canal), ce serait formidable !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X