J'ai travaillé sur le portage d'un jeu open source écrit à l'aide d'un pipeline à fonction fixe vers Metal.Réplication OpenGL Blending en métal
Je suis en mesure de refaire toute la transformation de projection et ont des choses en cours d'élaboration où ils doivent être établis avec les informations de texture et le sommet correct, mais je vais avoir beaucoup de mal à obtenir le fragment shader pour correspondre au mélange OpenGL , les textures semblent correctes mais le mélange et la luminosité sont désactivés.
Voici ce que je suis en train de faire correspondre:
ici est la façon dont il est rendu actuellement:
Le code que je peux voir contrôler l'apparence Blending GL comme:
glShadeModel(GL_SMOOTH);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
Il dessine les textures principales avec blending désactivé puis l'active sur les petits triangles (assez visibles sur ma version) entre eux. Des couleurs RVB sont également fournies pour chaque sommet.
Il peut y avoir d'autres appels modifiant l'état, mais je ne suis pas sûr de quoi d'autre à rechercher. Compte tenu de tout cela, je l'ai traduit en deux états de pipeline dont l'un est bloqué et l'autre activé. le mélange d'un est configuré pour ressembler à:
pipelineStateDescriptor.fragmentFunction = viewer.library.makeFunction(name: "borderFragment")!
pipelineStateDescriptor.colorAttachments[0].isBlendingEnabled = true
pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = .add
pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = .add
pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha