ios - 在 IOS 上将 CoreGraphics 渲染为 OpenGL 纹理

标签 ios pdf core-graphics opengl-es-2.0

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

最终目标是使用 CGContextDrawPDFPage 渲染非常高性能的 pdf 并将其写入特定的纹理 id

OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId);

看起来CoreGraphics无法直接渲染到特定的“ native 纹理ID”。

最佳答案

是的,您可以通过将核心图形内容渲染到位图上下文并将其上传到纹理。以下是我用来将 UIImage 绘制到 Core Graphics 上下文的代码,但您可以用自己的绘制代码替换 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() 等),这可能会让您直接渲染到纹理的字节。但是,我发现使用纹理缓存创建和渲染纹理的开销使得渲染单个图像的速度稍微慢一些,因此如果您不需要不断更新,上面的代码可能是您最快的路线。

关于ios - 在 IOS 上将 CoreGraphics 渲染为 OpenGL 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903864/

相关文章:

ios - CGAffineTransform 仅缩放宽度和高度

ios - 为 ePOS-print iOS sdk 模拟打印

iphone - 如何在UIWebView中显示本地pdf文件?

ios - 将 BGRA 转换为 ARGB

c++ - zLib inflate 在某些情况下结果为空

php - 如何将网站帖子转换为pdf?

swift - 为什么我的椭圆不在中心?

ios - View Controller 之间的 TableView 单元格操作

iphone - 使用 UIButton 按下传递对象数据

ios - 与服务器的安全通信 - 解决方案