菜鸟教程小白 发表于 2022-12-12 10:06:56

ios - 如何在 opengl es 中使用 Apples Core Image


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

<p>我究竟如何获取一个 opengles 纹理并将其发送到 coreImage,然后返回到 opengles 进行显示?</p>

<p>这是一些基本上你放在 UIImage 中的代码,它返回一个模糊的。我卡住的地方是将纹理获取到 UIImage,我想知道它们是否是一种更好的方法,然后每次加载新的 UIImage。</p>

<pre><code>- (UIImage *)blurredImageWithImage:(UIImage *)sourceImage{

    //Create our blurred image
    CIContext *context = ;
    CIImage *inputImage = ;

    //Setting up Gaussian Blur
    CIFilter *filter = ;
    ;
    forKey:@&#34;inputRadius&#34;];
    CIImage *result = ;

    /*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 = ];

    UIImage *retVal = ;
    return retVal;
}
</code></pre>

<p>如图所示,核心图像可能比最有效的方法更好。
<a href="/image/koOYy.jpg" rel="noreferrer noopener nofollow"><img src="/image/koOYy.jpg" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您还没有尝试并注意到,您引用的方法会<em>杀死</em>性能——要从 GL 纹理创建 <code>UIImage</code>,您需要阅读一堆像素离开 GPU 并进入 CPU 内存。然后 CoreImage 可能会将其发送到 GPU 以执行其效果,但是由于您从中获得了 <code>UIImage</code> ,因此您在将图像发送回 GPU 之前再次从 GPU 读取用作纹理。那是每帧四次数据传输,而且每一次都很昂贵。</p>

<p>相反,将 Core Image 保留在 GPU 上,并且不要使用中间的 <code>UIImage</code>。 </p>

<ol>
<li><p>您需要保留一个 <code>CIContext</code> 以进行渲染,因此请尽早使用 <a href="https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIContext_Class/index.html#//apple_ref/occ/clm/CIContext/contextWithEAGLContext:" rel="noreferrer noopener nofollow"><code>contextWithEAGLContext:</code></a> 从您的 GL 上下文中创建一个并坚持下去。</p></li>
<li><p>使用 <a href="https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIImage_Class/index.html#//apple_ref/occ/clm/CIImage/imageWithTexture:size:flipped:colorSpace:" rel="noreferrer noopener nofollow"><code>imageWithTexture:size:flipped:colorSpace:</code></a>从您的 GL 纹理创建 <code>CIImage</code>。 </p></li>
<li><p>当您想将过滤器链的结果渲染到 GL 纹理时,将其与 <code>glBindFramebuffer</code> 绑定(bind)(就像您制作自己的渲染到纹理传递一样),并使用 <a href="https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIContext_Class/index.html#//apple_ref/occ/instm/CIContext/drawImage:inRect:fromRect:" rel="noreferrer noopener nofollow"><code>drawImage:inRect:fromRect:</code></a> 在您的 <code>CIContext</code> 中绘制过滤器的输出 <code>CIImage</code> . (并且不要忘记在使用它执行其他 GL 渲染之前重新绑定(bind)该纹理。)</p></li>
</ol>

<p>这在 2012 年的 WWDC 演讲中得到了很好的介绍:<a href="https://developer.apple.com/videos/play/wwdc2012-511/" rel="noreferrer noopener nofollow">Core Image Techniques</a> .讨论从 40:00 左右开始,代码和演示持续到 46:05 左右。但是在接下来的演讲中,您将获得更多的演示、灵感、代码和架构技巧,这些都是您可以在 GL 中使用 CoreImage 做的有趣事情,让游戏看起来很棒。</p>

<p>此外,如果您使用 Metal (
页: [1]
查看完整版本: ios - 如何在 opengl es 中使用 Apples Core Image