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.
Si je change cette ligne :
texturePipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm;
Sur cette ligne :
texturePipelineDescriptor.colorAttachments[0].pixelFormat = MTLPixelFormatBGRA8Unorm;
J'obtiendrai les résultats suivants :
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.