任何人都知道如何将一点 OpenGL 代码转换为金属?

Anyone know how to convert a little OpenGL code to metal?

我一直在为我的 objective-c 相机捕捉会话使用一些 OpenGL 代码,但我几乎无法理解。现在 OpenGL 贬值了,我不知道如何将这一点 OpenGL 代码转换为金属。如果有人知道足以转换以下内容,请帮助。

if (self.eaglContext != [EAGLContext currentContext]) {
    [EAGLContext setCurrentContext:self.eaglContext];
}
glClearColor(0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

还有一些我没看到的 OpenGL:

_eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
_videoPreviewView = [[GLKView alloc] initWithFrame:self.view.bounds context:_eaglContext];
_videoPreviewView.enableSetNeedsDisplay = NO;
_videoPreviewView.transform = CGAffineTransformMakeRotation(M_PI_2);
_videoPreviewView.frame = self.view.bounds;
[self.view addSubview:_videoPreviewView];
[self.view sendSubviewToBack:_videoPreviewView];
[_videoPreviewView bindDrawable];
_videoPreviewViewBounds = CGRectZero;
_videoPreviewViewBounds.size.width = _videoPreviewView.drawableWidth;
_videoPreviewViewBounds.size.height = _videoPreviewView.drawableHeight;
_ciContext = [CIContext contextWithEAGLContext:_eaglContext options:@{kCIContextWorkingColorSpace : [NSNull null]} ];

这不是从 OpenGL 到 Metal 的微不足道的转换。第一步是用 MTKView 替换 GLKView。然后您需要创建一个 id<MTKViewDelegate> 来处理实际绘图、调整大小等。我建议观看 WWDC 2016 的 Adopting Metal 视频。它展示了如何起床和 运行 MTKView.

要进行混合,您需要在用于创建渲染管道状态的 MTLRenderPipelineColorAttachmentDescriptor 上设置混合选项。您需要将 blendingEnabled 属性 设置为 YES,并将 rgbBlendOperation 属性 设置为 MTLBlendOperationAdd。然后将 sourceRGBBlendFactor 设置为 MTLBlendFactorOne,将 destinationRGBBlendFactor 设置为 MTLBlendFactorOneMinusSourceAlpha

您可以通过 +[CIContext contextWithMetalDevice:options:]

id<MTLDevice> 创建 CIContext