2017-02-01 21 views
1

Я работал над портированием игры с открытым исходным кодом, написанной с использованием фиксированного функционального конвейера для Metal.Репликация OpenGL Blending in Metal

Я был в состоянии повторить все преобразование проекции и есть вещи, втягивается где они должны быть отрисованы с правильной информацией текстуры и вершин, но у меня много проблем получения фрагмента шейдера, чтобы соответствовать OpenGL смешивания , текстуры выглядят правильно, но смешение и яркость отключены.

Вот что я хочу, чтобы соответствовать:

GoodRender

вот как это в настоящее время рендеринга:

enter image description here

код, который я могу видеть управления GL Blending выглядит например:

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); 

Он рисует основные текстуры с отключенным смешением, а затем позволяет использовать его на маленьких треугольниках (вполне видимых в моей версии) между ними. Для каждой вершины предусмотрены цвета RGB.

Может быть другое изменение состояния, но я не уверен, что еще искать.

Учитывая все это, я перевел его в два состояния конвейера с отключенным смешением, а другой с включенным. усреднительные один настроено выглядеть следующим образом:

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 

ответ

1

Я нашел эту проблему, это было с тем, как были созданы текстуры, а не как смешивание было создано, который был правильным. При создании текстур с помощью MetalKit на одном наборе я использовал опцию: [MTKTextureLoaderOptionSRGB: NSNumber(value:0)] и не на другой. Когда оба они были одинаковыми (1 или 0), они совпадали, и смешение работало правильно.

Shader закончилось тем, что:

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; 
} 
Смежные вопросы