iOS上にOpenGL ES 2次元レンダラを書く必要があります。それは線やポリゴンのようないくつかのプリミティブを2D画像に描画する必要があります(ベクトルマップのレンダリングになります)。どのようにOpenGLのコンテキストからそのタスクのイメージを取得するためのベストですか?私は、これらのプリミティブをテクスチャにレンダリングし、それからイメージを取得するのか、それとも何か?また、必要なもののように見えるサンプルやチュートリアルを誰かが提供してくれれば(2d GLの画像をレンダリングする)ことは素晴らしいことです。前もって感謝します!OpenGL ESイメージへの2dレンダリング
5
A
答えて
19
OpenGL ES 2次元シーンをレンダリングし、そのシーンの画像を抽出してOpenGL ESの外で使用する場合、2つの主要なオプションがあります。はるかに高速
GLubyte *rawImagePixels = (GLubyte *)malloc(totalBytesForImage);
glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels);
// Do something with the image
free(rawImagePixels);
秒、および、方法:
最初は単にあなたのシーンをレンダリングし、シーンのRGBAデータを取得し、以下のように、バイト配列に配置するglReadPixels()
を使用することですこれを行うには、テクスチャがiOS 5.0のテクスチャキャッシュによって提供されている、テクスチャに裏打ちされたフレームバッファオブジェクト(FBO)にシーンをレンダリングする必要があります。私はこのアプローチをthis answerに記述していますが、そこに生データアクセスのコードは示していません。
あなた行うテクスチャキャッシュを設定し、FBOテクスチャバインドするには、次
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d");
}
// Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/
CFDictionaryRef empty; // empty value for attr value.
CFMutableDictionaryRef attrs;
empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary
NULL,
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
attrs = CFDictionaryCreateMutable(kCFAllocatorDefault,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attrs,
kCVPixelBufferIOSurfacePropertiesKey,
empty);
//CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget);
CVPixelBufferCreate(kCFAllocatorDefault,
(int)imageSize.width,
(int)imageSize.height,
kCVPixelFormatType_32BGRA,
attrs,
&renderTarget);
CVOpenGLESTextureRef renderTexture;
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
rawDataTextureCache, renderTarget,
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)imageSize.width,
(int)imageSize.height,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture);
CFRelease(attrs);
CFRelease(empty);
glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0);
をして、あなただけではなく、RGBAのBGRAフォーマットで(このテクスチャをバックアップバイトから直接読み取ることができますglReadPixels()
)のようなもの使用して:あなただけのOpenGL ESの中にあなたのイメージを再利用したい場合は、あなただけのテクスチャ担保FBOに、あなたのシーンをレンダリングする必要があり、その後の2番目のレベルでそのテクスチャを使用
CVPixelBufferLockBaseAddress(renderTarget, 0);
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget);
// Do something with the bytes
CVPixelBufferUnlockBaseAddress(renderTarget, 0);
をレンダリング。
これを実際に見たい場合は、オープンソースGPUImageフレームワーク内のCubeExampleサンプルアプリケーション内で、テクスチャにレンダリングし、その上で何らかの処理を実行する例を示します。
関連する問題
- 1. 2D OpenGL ESアーキテクチャ
- 2. OpenGL ES 3.0:テクスチャへのゼロコピーCPUレンダリング?
- 3. ユーザ空間メモリへのOpenGL ESレンダリング
- 4. 2Dスプライト用のOpenGL ESドロップシャドウ
- 5. OpenGl ES 2D Android再描画
- 6. iPhone OpenGL ESテクスチャ2Dマスキング
- 7. アンドロイド用OpenGL ESでの2Dゲーム用レンダリング画像
- 8. OpenGL-ESへのOpenGL - glBegin();
- 9. OpenGL es glDrawTexfOES()2Dテクスチャはレンダリングされません
- 10. OpenGL ES 1.0 - 不正なレンダリング
- 11. iPhone OpenGL ES 2dの背景テクスチャ
- 12. OpenGL ES 2.0での2D描画(iOS)
- 13. OpenGL ES/Angle:単一チャネルの浮動小数点テクスチャへのレンダリング
- 14. OpenGL ES、Zバッファ、2Dスプライト、破棄、パフォーマンス
- 15. 2D OpenGL ESシーンをパンする方法
- 16. OpenGL ES 2からOpenGLへの移植
- 17. OpenGL ES 2.0の小さなオブジェクトのレンダリング
- 18. アンドロイドネイティブOpenGL ES 3.0 PBOレンダリング空の画面
- 19. GLKitを使ったオンデマンドOpenGL ESレンダリング
- 20. Android OpenGL ES 2. 0 VBOレンダリングしない
- 21. キューブへのOpenGLレンダリング
- 22. OpenGL - テクスチャへのレンダリング
- 23. iOS - OpenGL ES 2でBiPlanarピクセル形式を使用してYUV420pイメージをレンダリングする
- 24. シェーダなしのOpenGL ESへのPhotoshopブレンドモード
- 25. OpenGL 2d矩形がレンダリングされない
- 26. XNAテクスチャ2Dへのレンダリング
- 27. GLESのOpenGL ES 2.0のAndroidの画面の2D点
- 28. OpenGL ES:2D配列テクスチャの単一レイヤを2Dテクスチャのサブリージョンにコピー
- 29. OpenGL ES 3.xからES 2へのダウングレード
- 30. QMLアイテムへのOpenGLレンダリング
ありがとうございますが、これはiOS 5でのみ動作しますか? – medvedNick
@medvedNick - 'glReadPixels()'はすべてのOSバージョンで動作しますが、テクスチャキャッシュはiOS 5.0で初めて導入されました。彼らははるかに高速ですが、5.0のみです。あなたはランタイムチェックを行うことができ、古いOSバージョンではより遅い 'glReadPixels()'にフォールバックすることができます。ここでもGPUImageコードをチェックしてください。 –
テクスチャキャッシュは5.0以上ですが、特定のデバイスで高速ではありませんか?例えば4S/iPad2で高速化し、どこでもglReadPixels/glTexImage2Dに相当します。 –