Я работаю над приложением для рисования на металлической основе, в котором я делю рисунок штриха на два этапа: на первом этапе передний край штриха выводится на экран и целиком переносится в текстуру MTL с помощью:
metalTextureComposite = self.currentDrawable!.texture
второй шаг рисует обновленную переднюю кромку продвигающегося штриха и совмещает поверх многоугольника с текстурой последнего сохраненного metalTextureComposite.
Этот метод позволяет мне рисовать бесконечно длинные штрихи без ущерба для производительности, поскольку эти два шага повторяются для каждого кадра цикла рисования.
Проблема, с которой я сталкиваюсь, заключается в том, что при использовании желаемого комбинированного режима исходного кода (см. Ниже код) я вижу только передний край штриха, отображаемого на экране. Это говорит мне, что либо я не адекватно захватываю metalTextureComposite из currentDrawable, либо делаю неправильные предположения относительно используемого режима смешивания, который, кстати, выглядит следующим образом:
renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
Если я использую разные режимы наложения, я вижу обводку целиком, но не обязательно то, что мне нужно. Ниже приведена часть кода, который я включаю в метод draw () MTKView.
func metalRenderStampArray() {
// first encode uber-stamp with previous loop's metalTextureComposite in a background polygon
// note metalTexture= metalTextureComposite contains previous loop's drawable contents
metalCommandEncode(renderCommandEncoder: renderCommandEncoder, stampLayer: stampLayerMode.stampLayerBG, vertexArrayStamps: vertexArrayStampsBG, metalTexture: metalTextureComposite) // background uber-stamp
// empty out uber-stamp in preparation for the next cycle
initializeStampArrays(stampLayer: stampLayerMode.stampLayerBG)
// next, encode current subCurve chunk polygons in foreground
// note metalTexture=brushTexture.texture is a round brush texture with alpha
metalCommandEncode(renderCommandEncoder: renderCommandEncoder, stampLayer: stampLayerMode.stampLayerFG, vertexArrayStamps: vertexArrayStampsFG, metalTexture: brushTexture.texture) // foreground sub-curve chunk
renderCommandEncoder?.endEncoding() // finalize renderEncoder set up
// now present bg + fg composite which is where I see the problem
commandBuffer?.present(self.currentDrawable!)
// 7b. Render to pipeline
commandBuffer?.commit() // commit and send task to gpu
metalTextureComposite = nil // empty out before re-populating
metalTextureComposite = self.currentDrawable!.texture // set up bg texture for next iteration
metalStampComputeComposite() // compute coordinates for the background composite stamp for the next iteration
} // end of func metalRenderStampArray()
Должен ли я обрабатывать metalTextureComposite по-другому (поскольку он записывается со скоростью 1 / fps), и если да, как мне с этим справиться? Цель состоит в том, чтобы использовать единый режим наложения для фонового полигона и основных полигонов штрихов. Любая помощь будет оценена.