2012-03-28 139 views
1

在iOS上使用CoreGraphics非常容易使用,但是可以得到CoreGraphics的輸出並將其放入OpenGL紋理?將CoreGraphics渲染爲IOS上的OpenGL紋理

的最終目標是使用CGContextDrawPDFPage呈現非常高性能的PDF文件,並與

OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId); 

寫入到一個特定的紋理ID它看起來像CoreGraphics不能夠直接呈現到一個特定的「天然紋理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()等),這可能讓你直接呈現到您的紋理字節。然而,我發現用紋理緩存創建和渲染紋理的開銷會使渲染單個圖像的速度稍微慢一點,所以如果你不需要不斷更新它,上面的代碼可能是你最快的路線。