2017-02-01 2 views
1

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 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:

GoodRender

ici est la façon dont il est rendu actuellement:

enter image description here

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 

Répondre

1

J'ai trouvé le problème, il était avec la façon dont les textures ont été créées, pas comment le mélange a été mis en place qui était correcte. Lors de la création des textures avec MetalKit sur un ensemble, j'ai utilisé l'option: [MTKTextureLoaderOptionSRGB: NSNumber(value:0)] et pas de l'autre. Quand ils étaient tous les deux réglés pour être identiques (1 ou 0) ils correspondaient et le mélange fonctionnait correctement.

Shader a fini par être:

fragment float4 terrainFragment(FragmentIn inFrag [[stage_in]], 
          texture2d<float, access::sample> colorTexture [[ texture(0) ]], 
          sampler colorSampler [[ sampler(0) ]]) { 
    float4 color = colorTexture.sample(colorSampler, inFrag.uv * 1.33); 
    color *= float4(inFrag.shadow,inFrag.shadow,inFrag.shadow,1); 
    return color * 4; 
}