在IOS上将CoreGraphics渲染到OpenGL纹理

在IOS上将CoreGraphics渲染到OpenGL纹理,ios,pdf,core-graphics,opengl-es-2.0,Ios,Pdf,Core Graphics,Opengl Es 2.0,在iOS上使用CoreGraphics非常容易,但是可以获得CoreGraphics的输出并将其放入OpenGL纹理中 最后一个目标是使用CGContextDrawPDFPage渲染高性能的pdf,并使用 OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId); 看起来,CoreGraphics无法直接渲染到特定的“本机纹理id”。是的,您可以将核心图形内容渲染到位图上下文并上载到纹理。以下是我用来将UIImage绘制到核心图形上下文的代码,但

在iOS上使用
CoreGraphics
非常容易,但是可以获得
CoreGraphics
的输出并将其放入
OpenGL
纹理中

最后一个目标是使用
CGContextDrawPDFPage
渲染高性能的pdf,并使用

OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId);

看起来,
CoreGraphics
无法直接渲染到特定的“本机纹理id”。

是的,您可以将核心图形内容渲染到位图上下文并上载到纹理。以下是我用来将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()
等),它可以让您直接渲染到纹理的字节。但是,我发现使用纹理缓存创建和渲染纹理的开销会使渲染单个图像的速度稍慢,因此,如果不需要不断更新,那么上面的代码可能是最快的路线。

我也在尝试使用Core Graphics为OpenGL创建纹理。但是,当我提供诸如
context.fill(rect1)
之类的绘图代码时,我会遇到错误的访问错误。我目前正在尝试从PreparePengl()创建纹理,但我尝试了drawRect(:)并得到了相同的结果。看起来你们都在NSOpenGLView中创建CGContext,是吗?有什么想法吗?