gpt4 book ai didi

ios - 如何使用 Apples Core Image 和 opengl es

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:58:48 25 4
gpt4 key购买 nike

所以我的 opengl es 游戏中有一个纹理(在帧缓冲区中),我一直想模糊它。我一直在尝试多种方法来查看哪种方法可以获得最佳 FPS,因为这需要在纹理不断变化时实时发生。

我怎样才能将 opengles 纹理发送到 coreImage,然后返回到 opengles 进行显示?

这段代码基本上是您放入 UIImage 并返回模糊图像的代码。我被卡住的地方是将该纹理获取到 UIImage,我想知道它们是否比每次加载新 UIImage 更好。

- (UIImage *)blurredImageWithImage:(UIImage *)sourceImage{

// Create our blurred image
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:sourceImage.CGImage];

// Setting up Gaussian Blur
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:15.0f] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

/* CIGaussianBlur has a tendency to shrink the image a little, this ensures it matches
* up exactly to the bounds of our original image */
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

UIImage *retVal = [UIImage imageWithCGImage:cgImage];
return retVal;
}

如图所示,核心图像可能比最有效的方法更好。 enter image description here

最佳答案

如果您还没有尝试并注意到,您引用的方法将杀死性能 — 要从 GL 纹理创建 UIImage,您需要阅读一堆像素离开 GPU 并进入 CPU 内存。 CoreImage 可能会随后将其发送到 GPU 以执行其效果,但由于您从中获得了 UIImage,因此在将图像发送回 GPU 之前,您需要再次从 GPU 读取数据用作纹理。即每帧传输四次数据,每次传输都很昂贵。

相反,将 Core Image 保留在 GPU 上,并且不要使用中间 UIImage

  1. 您需要保留一个 CIContext 用于渲染,因此请尽早使用 contextWithEAGLContext: 从您的 GL 上下文创建一个坚持下去。

  2. 使用 imageWithTexture:size:flipped:colorSpace:从您的 GL 纹理创建一个 CIImage

  3. 当您想将过滤器链的结果渲染到 GL 纹理时,使用 glBindFramebuffer 将其绑定(bind)(就像您制作自己的渲染到纹理传递一样), 并使用 drawImage:inRect:fromRect: 在您的 CIContext 中绘制过滤器的输出 CIImage . (并且不要忘记在使用它执行其他 GL 渲染之前重新绑定(bind)该纹理。)

这在 2012 年的 WWDC 演讲中有很好的介绍:Core Image Techniques .讨论从 40:00 左右开始,代码和演示一直持续到 46:05 左右。但请继续听完之后的其余演讲,您将获得更多演示、灵感、代码和架构技巧,了解您可以使用 GL 中的 CoreImage 做的有趣事情,让游戏看起来很棒。

此外,如果您使用 Metal (🤘) 进行渲染,则有相应的 CoreImage API 用于执行相同的工作流程(contextWithMTLDevice:imageWithMTLTexture:)。

关于ios - 如何使用 Apples Core Image 和 opengl es,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34712915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com