Я работал над портированием игры с открытым исходным кодом, написанной с использованием фиксированного функционального конвейера для Metal.Репликация OpenGL Blending in Metal
Я был в состоянии повторить все преобразование проекции и есть вещи, втягивается где они должны быть отрисованы с правильной информацией текстуры и вершин, но у меня много проблем получения фрагмента шейдера, чтобы соответствовать OpenGL смешивания , текстуры выглядят правильно, но смешение и яркость отключены.
Вот что я хочу, чтобы соответствовать:
вот как это в настоящее время рендеринга:
код, который я могу видеть управления 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