2012-03-28 81 views
1

iOSでCoreGraphicsを使用することは非常に使いやすいですが、CoreGraphicsの出力を取得してOpenGLテクスチャに入れることは可能ですか?CoreGraphicsからIOSのOpenGLテクスチャにレンダリング

最終的な目標は、それはCoreGraphicsように見えるん

OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId); 

で非常にパフォーマンスのPDFのレンダリング、特定のテクスチャIDにそれを書くためにCGContextDrawPDFPageを使用することですが、特定の「ネイティブテクスチャIDに直接描画することができません"

答えて

2

はい、Core Graphicsコンテンツをビットマップコンテキストにレンダリングし、それをテクスチャにアップロードすることで可能です。以下は、私はコアグラフィックスコンテキストにUIImageを描画するために使用したコードですが、あなた自身の描画コードでCGContextDrawImage()部分を置き換えることができます:

GLubyte *imageData = (GLubyte *) calloc(1, (int)pixelSizeOfImage.width * (int)pixelSizeOfImage.height * 4); 
CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB();  
CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [newImageSource CGImage]); 
CGContextRelease(imageContext); 
CGColorSpaceRelease(genericRGBColorspace); 

glBindTexture(GL_TEXTURE_2D, outputTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData); 

これはあなたのようなコードを使用してテクスチャを作成したことを前提としてい次

glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &outputTexture); 
glBindTexture(GL_TEXTURE_2D, outputTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
// This is necessary for non-power-of-two textures 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glBindTexture(GL_TEXTURE_2D, 0); 

を急速に変化するコンテンツについて、あなたはあなたのテクスチャのためにバイトに直接レンダリングしてみましょう可能性があるのiOS 5.0のテクスチャキャッシュ(CVOpenGLESTextureCacheCreateTextureFromImage()など)、に見たいと思うかもしれません。しかし、私は、テクスチャキャッシュを使ってテクスチャにテクスチャを作成してレンダリングするためのオーバーヘッドが、単一のイメージをレンダリングするのにこれを若干遅くすることが分かったので、これを継続的に更新する必要がない場合はおそらく上記のコードが最速のルートです。

関連する問題