2012-01-26 11 views
3

私はそれ以外のやり方を知っています。しかし、CPUメモリにコピーすることなく、テクスチャからCIImageを作成するにはどうすればよいですか? [CIImage imageWithData]? CVOpenGLESTextureCache?OpenGL ESのテクスチャをCIImageに変換する方法

+0

を、これが可能になりました。 – akaru

答えて

4

残念ながら、私はglReadPixels()を使用してピクセルデータを読み取らなければならないという方法はないとは思いません。 CIImage(data、CGImageRef、CVPixelBufferRef)の入力はすべてCPU側ですので、CIImageに渡すための高速パスはありません。 glReadPixels()を使用して、生のRGBAデータをテクスチャから引き出し、-initWithData:options:とのピクセル形式を使用してCIImageに送信することをお勧めします。 (アップデート:3/14/2012)iOS 5.0では、新しいテクスチャキャッシュを使用してOpenGL ESフレームデータを取得する方法がより簡単になりました。私はこれを詳細にthis answerで説明します。

しかし、あなたが望むものを達成するための別の方法があるかもしれません。単に画面に出力するためにテクスチャにフィルタを適用する場合は、my GPUImage frameworkを使用して処理することができます。すでにOpenGL ES 2.0をレンダリングパイプラインのコアとして使用しています。テクスチャは、イメージやビデオのフレームがあるフィルタから次のフィルタに渡される方法です。私のベンチマークでは、Core Imageよりもはるかに高速です。

テクスチャを入力としてここに入力すると、CPUに触れる必要がなくなります。 OpenGL ESから生のテクスチャを取得するためのストッククラスはまだありませんが、既存のGPUImageOutputサブクラスのコードを変更して、これをソースとしてかなり簡単に使用することができます。その後、フィルターを連鎖させて、出力を画面または静止画に向けることができます。ある時点で、この種のデータソース用のクラスを追加しますが、プロジェクトはまだかなり新しいです。

+1

ありがとう、Brad。 CVOpenGLESTextureCacheで作業しましたか?他の方法がない場合は、glReadPixelsの代わりになるはずです。 OS Xについて私の質問にちょうど方法があります.AppleがGPUにどのように注力しているかによって、方法があるはずです... – akaru

+0

@akaru - 私が何かが欠けていない限り、CVOpenGLESTextureCacheは単方向アップロード用ですテクスチャを素早く作成できます。私は、OpenGL ESテクスチャから何かを読み返すのに使うことはできないと思います。ヘッダーやアップルのプレゼンテーションでこれを行うことについての言及はありませんでした。私は、iOS上で 'glReadPixels()'がついていると思います。 –

+0

@akaru - これについてのあなたの以前の質問を見つけることができませんが、テクスチャキャッシュが単方向であることについて間違っていました。私はちょうど彼らがビデオをエンコードするように働いていて、 'glReadPixels()'より速いです:http://stackoverflow.com/a/9704392/19679 –

0

あなたはこれらの有用を見つけるかもしれない:一般的に

は、私は、画像データがCPUにGPUからコピーする必要があると思います。しかし、上記のiOSの機能は、これをより簡単かつ効率的にするかもしれません。

関連する問題