はい、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()
など)、に見たいと思うかもしれません。しかし、私は、テクスチャキャッシュを使ってテクスチャにテクスチャを作成してレンダリングするためのオーバーヘッドが、単一のイメージをレンダリングするのにこれを若干遅くすることが分かったので、これを継続的に更新する必要がない場合はおそらく上記のコードが最速のルートです。